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

标签 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

最佳答案

函数“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/

相关文章:

python - 属性错误 : Manager isn't accessible via Section instances

python - Python 中的多层 .gdb 文件?

python 调用类方法而不初始化类

python - Rabbitmq 鼠兔自动重连

python - 运行一个小型 HTTP 服务器来检查回调

python - 行没有被正确删除

python - 为什么分配给一个空列表而不是一个空元组是有效的?

分离进程的Pythonic方式?

python - 在 Python 或 Bash 中计算代码行数的实用程序

java - 如何在一个 jar 中分发包含 jython 代码的 java 包?