【发布时间】:2011-10-17 20:08:46
【问题描述】:
我正在寻找 property 内置函数的纯 Python 实现,以了解初始化的工作原理。我发现许多处理描述符接口(@987654324@、__set__)但没有描述setter 或deleter 方法。这是Python Decorator Library中的definition(大致)它的实现方式吗?
【问题讨论】:
标签: python properties descriptor
我正在寻找 property 内置函数的纯 Python 实现,以了解初始化的工作原理。我发现许多处理描述符接口(@987654324@、__set__)但没有描述setter 或deleter 方法。这是Python Decorator Library中的definition(大致)它的实现方式吗?
【问题讨论】:
标签: python properties descriptor
属性是一个简单直接的描述符。描述符协议由三种方法组成:__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
【讨论】:
fset 并返回self(或者可能返回其自身的副本,我不太记得了)。不涉及火箭科学。
fset 的副本也是有效的。
作为评论:有一种简单的方法可以将属性添加到 Python 列表对象。在类中变形。
>>> class Foo(list): pass
>>> l = Foo([1,2,3])
>>> l.foo = 'bar'
>>> l
[1, 2, 3]
【讨论】: