Pythonic Möglichkeit zum dynamischen hinzufügen von Eigenschaften und setter
Arbeite ich an einer Bibliothek für eine 3D-Anwendung, umschließt die Funktionalität der Anwendung in einer Reihe von Python-Klassen, sowie zusätzliche Funktionen hinzufügen, dass die Anwendung nicht.
Habe ich eine Reihe von Eigenschaften, die in meine base-Klasse zum hinzufügen von Attributen zu einem Knoten mit der vorhandenen API, aber ich möchte eine weitere elegante Möglichkeit, hinzufügen von Attributen dynamisch. Ich habe momentan diesen code (die wahrscheinlich nicht viel Sinn, ohne Vertrautheit mit der 3D-Anwendung), aber der wichtige Teil ist die
# Add block properties
und
# PROPERTIES
code.
class Block(pyunify.Transform):
def __init__(self, name = "Character"):
pyunify.Transform.__init__(self, name)
self.LockTransform()
class Spine(Block):
def __init__(self, name = "Character", numberOfJoints=6):
Block.__init__(self, name+"_spine")
# Add block properties
self.AddAttr("numberOfJoints", "long")
self.SetAttr("numberOfJoints", numberOfJoints)
# Create block template
self.Template()
# PROPERTIES
@property
def numberOfJoints(self):
return self.GetAttr("numberOfJoints")
@numberOfJoints.setter
def numberOfJoints(self, num):
self.SetAttr("numberOfJoints", num)
So, ich könnte vorhersehen, zusätzliche Klassen mit viel mehr Eigenschaften, und die Art und Weise, ich habe es jetzt, für jede Eigenschaft muss ich hinzufügen, dass es in _init__
self.AddAttr("numberOfJoints", "long")
self.SetAttr("numberOfJoints", numberOfJoints)
und dann habe ich 2 weitere Funktionen in meiner Klasse, eine getter-und setter, die Eigenschaft also, die ich nennen kann, die in meiner Klasse als du selbst.numberOfJoints und es wird die Interaktion mit der Klasse selbst sowie das korrekte einstellen von Parametern, die für den betreffenden Knoten in der 3D-Anwendung.
@property
def numberOfJoints(self):
return self.GetAttr("numberOfJoints")
@numberOfJoints.setter
def numberOfJoints(self, num):
self.SetAttr("numberOfJoints", num)
Der einzige Unterschied mit der zusätzlichen Eigenschaft Funktionen werden der name, so war ich Frage mich, ob es war ein Weg, ich könnte einen AddProperty-Funktion in meinem base-Block-Klasse so, dass ich nur das in meiner _init__ Funktion:
self.AddProperty("numberOfJoints", "long")
self.numberOfJoints = 5
und es wird dynamisch erzeugen der getter-und setter-Funktionen zusätzlich zu der Ausführung der aktuellen _init__ Zeile
self.AddAttr("numberOfJoints", "long")
Jede mögliche Hilfe würde geschätzt!
Dank!
- Sind Sie gerade versuchen zu tun
self.numberOfJoints = numberOfJoints
? - Ich versuche zu tun
self.numberOfJoints = numberOfJoints
wo Sie das Attribut, wird eine zusätzliche Funktion:self.AddAttr("numberOfJoints", "long"); self.SetAttr("numberOfJoints", self.numberOfJoints)
und andere code
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, etwas zu tun, sieht aus wie Eigenschaft zugreifen, aber unter die führt eine Funktion aus, Sie wollen ein Deskriptor. Ein Deskriptor ist ein Objekt, das aussieht wie ein Eigentum, sondern fängt get-und set-Anrufe und können Sie ausführen, was auch immer code, den Sie benötigen. Hier ist ein stackoverflow-Frage mit einem Beispiel, dass die Deskriptoren verwendet, um ein Objekt ändern der übersetzung mit Deskriptoren:
https://stackoverflow.com/a/22292961/1936075
Können Sie den gleichen trick zu erstellen, abrufen und festlegen von benutzerdefinierten Parametern in einem mehr lesbar, weniger Befehle-heavy-Mode.
Mehr code hier.