3

我正在寻找property内置的纯 Python 实现来了解初始化的工作原理。我发现许多处理描述符接口(__get__, __set__)但没有描述setterordeleter方法。Python 装饰器库中的这个定义(大致)是它的实现方式吗?

4

2 回答 2

3

属性是一个简单直接的描述符。描述符协议由三种方法组成:__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
于 2011-08-01T23:18:13.567 回答
0

作为评论:有一种简单的方法可以将属性添加到 Python 列表对象。在课堂上翘曲。

>>> class Foo(list): pass
>>> l = Foo([1,2,3])
>>> l.foo = 'bar'
>>> l
[1, 2, 3]
于 2013-04-28T18:54:30.230 回答