Пользовательское свойство Python с сеттером - PullRequest
2 голосов
/ 02 августа 2011

Я ищу чистую реализацию Python для свойства Python, встроенного, чтобы понять, как работает инициализация.Я обнаружил, что многие имеют дело с интерфейсом дескриптора ( get , set ), но ни один из них не описывает методы установки или удаления. это (грубо говоря) так, как это реализовано?

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Свойство - это простой и понятный дескриптор. Протокол дескриптора состоит из трех методов: __get__, __set__ и __delete__. Свойство для каждой из этих операций просто вызывает пользовательские функции.

class my_property(object):
    def __init__(self, getter, setter, deleter):
        self.getter  = getter
        self.setter  = setter
        self.deleter = deleter

    def __get__(self, instance, owner):
        return self.getter(instance)

    def __set__(self, instance, value):
        self.setter(instance, value)

    def __delete__(self, instance):
        self.deleter(instance)

class Foo(object):
    def __init__(self):
        self._x = 42

    def get_x(self):
        print 'getter'
        return self._x

    def set_x(self, value):
        print 'setter'
        self._x = value

    def del_x(self):
        print 'deleter'
        del self._x

    x = my_property(get_x, set_x, del_x)

obj = Foo()
print obj.x
obj.x = 69
del obj.x
print obj.x
0 голосов
/ 28 апреля 2013

В качестве комментария: существует простой способ добавить свойство в объект списка Python.Деформация в классе.

>>> class Foo(list): pass
>>> l = Foo([1,2,3])
>>> l.foo = 'bar'
>>> l
[1, 2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...