Python函数返回函数构造的属性

时间:2016-03-30 23:32:03

标签: python

在一些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

1 个答案:

答案 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