средство удаления удалителей, использующее свойство в Python - PullRequest
10 голосов
/ 16 декабря 2009

Я играю со свойством в Python, и мне было интересно, как работает этот декоратор @ propertyName.deleter. Я, наверное, что-то упустил, я не смог найти четких ответов от Google.

Чего я хотел бы добиться, так это когда средство удаления вызывается, я могу запускать другие действия (например, используя мой SDK для 3D-приложения).

На данный момент простое print () не срабатывает.

Когда *1001* del (instance.property) ?

срабатывает, удаляется deleter

Иначе, как мне этого добиться?


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)


Большое спасибо (:

Ответы [ 2 ]

11 голосов
/ 16 декабря 2009

Сделать M классом нового стиля:

class M(object):

См. http://www.python.org/download/releases/2.2.3/descrintro/#property:

Свойства не работают для классики классы , но вы не получите четкое ошибка при попытке этого. Ваш получить метод будет вызван, поэтому он появляется работать, но по атрибуту назначение, экземпляр классического класса будет просто установить значение в его dict без вызова метода set свойства, и после этого, метод get свойства не будет называется либо. (Вы можете переопределить setattr чтобы это исправить, но это будет непомерно дорого.)

7 голосов
/ 16 декабря 2009

В Python 3 вы бы увидели результат print - и затем AttributeError для последнего отпечатка (потому что _m исчез). Возможно, вы используете Python 2.6, и в этом случае вам нужно изменить предложение class на class M(object):, чтобы создать M новый стиль, и тогда вы получите то же поведение, что и в Python 3.

...