Я играю вокруг со свойством в Python, и я задавался вопросом, как этот @propertyName.deleter декоратор работает. Я, вероятно, пропускаю что-то, я не мог найти четкие ответы Google.
То, чего я хотел бы достигнуть, - когда это поведение средства удаления называют, я могу инициировать другие действия (например: использование моего 3-го SDK приложения).
На данный момент просто простая печать (), кажется, не инициирована.
Средство удаления запущено, когда я удаляю свойство с помощью del (instance.property)?
Иначе, как я могу достигнуть этого?
class M():
def __init__(self):
self._m = None
@property
def mmm(self):
return self._m
@mmm.setter
def mmm(self, val):
self._m = val
@mmm.deleter
def mmm(self):
print('deleting') # Not printing
del(self._m)
if __name__ == '__main__':
i = M()
i.mmm = 150
print(i.mmm)
del(i.mmm)
print(i.mmm)
Большое спасибо (:
Сделайте M классом нового стиля:
class M(object):
См. http://www.python.org/download/releases/2.2.3/descrintro/#property :
Свойства не работают в классической версии классы , но вы не получаете четкого ошибка при попытке это. Ваш получить будет вызван метод, поэтому он появится работать, но по атрибуту присвоение, экземпляр классического класса просто установит значение в своем dict без вызова метода set свойства, а после этого метод get свойства не будет называется либо. (Вы можете переопределить setattr , чтобы исправить это, но это будет слишком дорого.)
В Python 3 вы БУДЕТЕ увидеть результат print
- а затем AttributeError для последнего вывода (потому что _m
исчез). Возможно, вы используете Python 2.6, и в этом случае вам нужно изменить предложение class
на class M (object):
, чтобы сделать M
новым стилем, и тогда вы получите то же поведение, что и в Python 3.