在一些python包的源代码中找到了这个构造(它可能更常见)。这是怎么做的?
def fie(x):
def foo(y):
return 123
return property(foo)
尝试使用暂存器时,我无法对结果做任何事情:
fie(3)
<property object at 0x04D1BDE0>
fie(3)(4)
'property' object is not callable
答案 0 :(得分:1)
函数“fie”创建一个只有一个getter的数据描述符,它在每个实例“y”上总是返回“123”。
协议所需的参数“y”即使我们带回一个常量,而示例中的“x”也没有使用和混淆,所以让我们稍微改变一下:
def fie(x):
def foo(y):
print "Returning x"
return x
return property(foo)
class Dog(object):
age = fie(3)
>>> Dog.age
<property object at 0x1050565d0>
>>> pluto = Dog()
>>> pluto.age
Returning x
3
>>> pluto.age = 5
Traceback (most recent call last):
File "<pyshell#239>", line 1, in <module>
pluto.age = 5
AttributeError: can't set attribute
正如您所看到的,使用我们新的 fie 函数,我们在类<上创建一个名为 age 的属性,其值为 3 EM>狗。当在类上调用时,我们仍然将其视为属性的协议包装器,但在实例 pluto 上它发生了魔术。因为我们只定义了getter,所以该属性是只读的。
请注意,该类必须是新样式的(即继承自 object ),否则赋值将起作用并永远覆盖包装器,更改属性 age 到实例字典中的实际整数值:
class Dog2:
age = fie(7)
>>> ploto = Dog2()
>>> ploto.age
Returning original x
7
>>> ploto.age = 8
>>> ploto.age
8