【发布时间】:2015-05-24 13:09:52
【问题描述】:
假设我有一个类如下:
class MyClass(object):
def __init__(self, value=None):
self.attr = value
@property
def attr(self):
# This acts as a getter?
# Let's call the function "attr_1" as alias
return self.__attr
@attr.setter
def attr(self, value):
# This acts as a setter?
# Let's call the function "attr_2" as alias
self.__attr = value
inst = MyClass(1)
我阅读了Documentation on Descriptor 并查看了property 类的实现。
据我所知,当我输入inst.attr 时,会发生以下情况:
- 找到第一个
attr(别名为attr_1),attr现在是property类的一个实例,它是一个数据描述符。
因此,它将覆盖实例字典,这意味着调用了type(inst).__dict__['attr'].__get__(inst, type(inst))。 -
attr.__get__(inst, type(inst))调用attr.fget(inst),其中fget()实际上是attr(self)(“原始”attr_1函数)。 - 最后,
attr.fget(inst)返回inst.__attr。
第一个问题来了:类
MyClass没有属性__attr,那么第三步中的inst.__attr怎么解释?同样,在模拟的setter中,Python如何找到属性
inst.__attr来分配value?还有一个小问题:既然
property是一个类,为什么不用Property而不是property?
【问题讨论】:
-
property实际上被认为是一种类型,而不是一个类(它们是不同的东西) -
@thefourtheye
property的签名是property(fget, fset, fdel, doc)其中前三个参数是函数。问题中文档的链接显示了property的完整实现。
标签: python python-2.7 descriptor