属性对象是您实际上正在考虑的属性.考虑这个例子:
class Foo(object):
def __init__(self):
self._bar = 0
@property
def bar(self):
return self._bar + 5
Foo.bar是一个具有__get__方法的属性对象.当你写类似的东西
x = Foo()
print(x.bar)
查找x.bar发现类型(x).bar有一个__get__方法,因此属性查找变得等效于
type(x).bar.__get__(x, type(x))
产生值x._bar 5.
使用属性作为装饰器有点模糊了bar是属性对象的事实.一个等价的定义是
class Foo(object):
def __init__(self):
self._bar = 0
bar = property(lambda self: self._bar + 5)
更明确地显示您正在创建一个具有给定lambda表达式的属性对象作为该属性的getter,并将该对象绑定到类属性栏.
属性类(以及实例方法,类方法和静态方法)是Python的通用描述符协议的特定应用程序,它使用__get __,__ set__和/或__del__方法定义类属性的行为.