【发布时间】:2020-08-06 01:45:11
【问题描述】:
我对 python @*.getter 语法的实用性与简单地定义没有 getter 的属性有点困惑。
为了研究这个问题,让我们编写一个非常简单的类:
class Foo:
def __init__(self):
self._x = None
@property
def x(self):
print('Attribute `self.x` is a property.')
return self._x
@x.getter
def x(self):
print('Getting property `x`...')
return self._x
现在,如果我尝试实例化该类并从实例中获取属性 x,我们会看到调用了 getter 方法:
>>> A = Foo()
>>> print(A.x)
Getting property `x`...
None
好吧,那又怎样?这正是我们应该期待的。
但是,如果我定义完全相同的类没有任何 getter 方法,我们会得到不同的东西:
>>> print(A.x)
Attribute `self.x` is a property.
None
当没有定义 getter 方法时,尝试检索属性会导致调用“属性定义方法”(我的意思是在 @property 下定义的方法,因为没有更好的名称)。
有趣的是,在第一种情况下,@property 下定义的方法从未真正被调用过。
那么,如果原始属性定义在没有它的情况下似乎充当了一个 getter,那么拥有一个特殊的 getter 方法有什么意义呢?除了简单地说“这是一种财产”之外,最初的定义是否还有其他用途?是否有任何其他情况会调用此方法(除了在没有 getter 的情况下检索属性)?为什么选择使用 getter 而不是简单地将其功能合并到属性定义中?
最后,是否存在使用比以下规范形式更复杂的属性定义方法,同时还使用@*.getter 方法的用例?
@property
def x(self): return self._x
【问题讨论】:
标签: python properties