我已经成功地使用了Python属性,但看不到它们如何工作。如果我取消引用类之外的属性,我只会得到一个类型的对象property:
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!'
我注意到未绑定Foo.hello仍然是property对象,因此类实例化必须在做魔术,但是那是什么魔术呢?
Foo.hello
正如其他人指出的那样,它们使用称为描述符的语言功能。
当您通过类访问实际属性对象时,返回该属性对象的原因在于该属性Foo.hello如何实现__get__(self, instance, owner)特殊方法:
__get__(self, instance, owner)
owner
instance
self
除了“描述符”方法外,另请参阅《语言指南》中有关实现描述符和调用描述符的文档。