在一些 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
最佳答案
函数“fie”创建一个仅具有 getter 的数据描述符,在使用每个实例“y”时始终返回“123”。
即使我们带回一个常量,协议(protocol)也需要参数“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 函数,我们在类 < em>狗。当在类上调用时,我们仍然将其视为属性的协议(protocol)包装器,但在实例 pluto 上,它发生了魔法。而且因为我们只定义了 getter,所以该属性是只读的。
请注意,该类必须是新样式的(即从object继承),否则赋值将起作用并永远覆盖包装器,从而更改属性age转换为实例字典中的实际整数值:
class Dog2:
age = fie(7)
>>> ploto = Dog2()
>>> ploto.age
Returning original x
7
>>> ploto.age = 8
>>> ploto.age
8
关于Python 函数返回函数构造的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36321594/