Ho un descrittore su una classe e il suo metodo __set__
non viene chiamato. Ho cercato a lungo e duro su questo per alcune ore e non ho una risposta per questo. Ma quello che ho notato di seguito è che quando assegno 12 a MyTest.X, cancella il descrittore di proprietà per X, e lo sostituisce con il valore di 12. Quindi viene richiamata l'istruzione print per la funzione Get. Quello è buono.Perché il descrittore Python __set__ non viene chiamato
Tuttavia, l'istruzione di stampa per la funzione __set__
NON viene richiamata. Mi sto perdendo qualcosa?
class _static_property(object):
''' Descriptor class used for declaring computed properties that don't require a class instance. '''
def __init__(self, getter, setter):
self.getter = getter
self.setter = setter
def __get__(self, instance, owner):
print "In the Get function"
return self.getter.__get__(owner)()
def __set__(self, instance, value):
print "In setter function"
self.setter.__get__()(value)
class MyTest(object):
_x = 42
@staticmethod
def getX():
return MyTest._x
@staticmethod
def setX(v):
MyTest._x = v
X = _static_property(getX, setX)
print MyTest.__dict__
print MyTest.X
MyTest.X = 12
print MyTest.X
print MyTest.__dict__
Sei sicuro di voler utilizzare gli attributi di classe anziché creare un'istanza? – user2357112
Nel mio caso, che è molto complicato, questo è il wrapping di metodi statici, che alla fine vengono passati ai metodi statici di C++. –
Almeno SWIG ha avuto alcuni problemi con i protocolli dei descrittori, quindi la soluzione potrebbe trovarsi anche nel tuo involucro C++, se fai cose più complesse di quelle mostrate qui. – schlenk