Frage

Mit Python Ich mag eine Eigenschaft in einer Klasse schaffen, sondern die Namen es in einem String mit. Normalerweise Sie tun:

blah = property(get_blah, set_blah, del_blah, "bleh blih")

wo get_, set_ und del_blah werden entsprechend definiert. Ich habe versucht, das gleiche mit dem Namen der Eigenschaft in einer Variablen zu tun, wie folgt aus:

setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))

Aber das funktioniert nicht. Der erste Fall blah den Wert der Eigenschaft gibt, im zweiten Fall ist es eine Eigenschaft gibt, ist, dass <property object at 0xbb1aa0>. Wie soll ich es definieren, damit es funktioniert?

War es hilfreich?

Lösung

Wie viel würde ich sagen, der Unterschied ist, dass in der ersten Version, können Sie die Klassen ändern blah auf das Ergebnis der Eigenschaft Attribut und in der zweiten Sie legen Sie es auf die Instanz (das ist anders!).

Wie wäre es dieser Version:

setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))

Sie können dies auch tun:

setattr(type(self), "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))

Andere Tipps

Eine Möglichkeit ist, in Einheimischer zu schreiben ():

class X:
    for attr in ["a","b","c"]:
        def getter(self, name=attr):
            return name+"_value"
        locals()[attr] = property(getter, None, None, attr)

x = X()
print x.a
print x.b
print x.c

gibt

a_value
b_value
c_value

Wenn ich verstehe, was Sie versuchen, zu tun, könnte man es erreichen, indem die Klasse der übergeordneten getattr und < strong> setattr Methoden.

Zum Beispiel:

class Something(object):
    def __getattr__(self, name):
        # The name of the property retrieved is a string called name
        return "You're getting %s" % name

something = Something()

print something.foo
print something.bar

Will Druck:

You're getting foo
You're getting bar

So können Sie ein generisches Getter und Setter haben können, der den Namen der Eigenschaft in einer Zeichenkette hat und tut etwas damit entsprechend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top