2017-05-09 2 views
0

Kann eine @property-Funktion in einer Variablen gespeichert werden?@property-Funktionen speichern

Stellen wir den folgenden Code haben:

class I: 
    def __init__(self): 
    self.i = 0 

    def get_i(self): 
    return self.i 

a = I() 

f_i = a.get_i 

print(f_i()) 

a.i = 3 

print(f_i()) 

ich die Funktion get_i innerhalb einer Variablen speichern und verwenden. Der Ausgang wird wie erwartet:

0 
3 

Schauen Sie jetzt auf dem gleichen Code kann, aber dieses Mal mit einer @property Funktion:

class I: 
    def __init__(self): 
    self.i = 0 

    @property 
    def get_i(self): 
    return self.i 

a = I() 

f_i = a.get_i 

Jetzt a.get_i ist nicht die Funktion mehr (Es ist der Wert 0) . Gibt es eine Möglichkeit, die Funktion weiterhin in der Variablen f_i zu speichern?

Antwort

2

Der ganze Sinn eines property ist, dass es auf Zugriff aufgerufen wird. Sie müssen die descriptor protocol umgehen, um dies zu verhindern.

Sie können dies tun, indem Sie auf die Klasse der property Objekt Zugriff statt:

dann binden sie später auf eine Instanz:

print(f_i.__get__(a)) 

Oder Sie könnten die fget Getter-Funktion Zugriff auf das Eigenschaftsobjekt, binden Sie es an a, um eine gebundene Methode zu erstellen, und speichern Sie das Ergebnis für einen späteren Aufruf:

f_i = I.get_i.fget.__get__(a) 
print(f_i()) 

Der Zugriff auf die Eigenschaft der Klasse ruft immer noch das Deskriptorprotokoll auf, aber in diesem Fall gibt property.__get__ die Eigenschaft selbst zurück.

Demo:

>>> a = I() 
>>> I.get_i 
<property object at 0x10efceb88> 
>>> I.get_i.__get__(a) 
0 
>>> I.get_i.fget 
<function I.get_i at 0x10efc3048> 
>>> I.get_i.fget.__get__(a) 
<bound method I.get_i of <__main__.I object at 0x10efd32e8>> 
>>> I.get_i.fget.__get__(a)() 
0 
+0

'I.get_i.fget .__ get __ (a)' ist das, was ich suchte. Vielen Dank! – BlueSun

Verwandte Themen