python - Python 属性如何工作?

标签 python properties

我已经成功地使用了 Python 属性,但我不知道它们是如何工作的。如果我取消引用类之外的属性,我只会得到一个 property 类型的对象:

@property
def hello(): return "Hello, world!"

hello  # <property object at 0x9870a8>

但是如果我把一个属性放在一个类中,行为就大不相同了:

class Foo(object):
   @property
   def hello(self): return "Hello, world!"

Foo().hello # 'Hello, world!'

我注意到未绑定(bind)的 Foo.hello 仍然是 property 对象,所以类实例化一定是在施展魔法,但那是什么魔法呢?

最佳答案

正如其他人所指出的,他们使用一种称为描述符的语言功能。

通过Foo.hello类访问时返回实际属性对象的原因在于属性如何实现__get__(self, instance, owner) 特殊方法:

  • 如果在 instance 上访问描述符,则将该实例作为适当的参数传递,并且 owner 是该实例的 class实例。
  • 通过类访问时,则instance为None,只传递ownerproperty 对象识别并返回 self

除了Descriptors howto ,另见 Implementing Descriptors 上的文档和 Invoking Descriptors在语言指南中。

关于python - Python 属性如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6193556/

相关文章:

python - 在外部服务器中运行 pydocs - Python

java - java属性文件中的当前目录

javascript - 如何有效地计算 JavaScript 中对象的键/属性的数量

css - 在ng-repeat中动态创建类,并关联属性

Python:无法识别 Django 模型中的更改

python - 过滤多维数组

python - 从 VBA 到 Python,再回到 Excel

python - 如何在实例化时有条件地将 mixin 添加到当前类中?

c# - 如何返回属性的默认值?

php - 使用空格访问类属性