由于Python力求有一种正确的方法,我想知道property.getter的目的是什么。在这个例子中,WhyMe定义了一个getter,但是其他没有,所以我想知道property.getter关于使用property的意思。
class WhyMe(object):
def __init__(self):
self._val = 44
@property
def val(self):
print 'I am not called'
return self._val
@val.getter # What advantage do I bring?
def val(self):
print 'getter called'
return self._val
class Other(object):
def __init__(self):
self._val = 44
@property
def val(self):
print 'I AM called'
return self._val
使用它们:
>>> why = WhyMe()
>>> why.val
getter called
44
>>> other = Other()
>>> other.val
I AM called
44
我对属性并不陌生,我只是想知道制作一个吸气剂是否有一些优势,或者只是为了对称而放在那里?
答案 0 :(得分:4)
@property
让我们通过为该属性定义一个getter来定义一个全新的属性。 @original.getter
语法允许您覆盖只是现有的getter。对于属性可用的其他两种方法,还有.setter
和.deleter
装饰器。
想象一下,您继承了使用属性的自定义类,同时定义了getter和setter。如果您只想覆盖该属性的 getter 但保留 setter (或删除器),则可以使用@BaseClass.original.getter
执行此操作:
>>> class Foo(object):
... @property
... def spam(self):
... print 'Foo.spam called'
... return 'spam'
... @spam.setter
... def spam(self, value):
... print 'Foo.spam.setter called'
... @property
... def ham(self):
... print 'Foo.ham called'
... return 'ham'
... @ham.setter
... def ham(self, value):
... print 'Foo.ham.setter called'
...
>>> class Bar(Foo):
... @Foo.spam.getter
... def spam(self):
... print 'Bar.spam override'
... return 'eggs and spam'
... @property
... def ham(self):
... print 'Bar.ham override'
... return 'eggs and ham'
...
>>> Bar().spam
Bar.spam override
'eggs and spam'
>>> Bar().spam = 'foo'
Foo.spam.setter called
>>> Bar().ham
Bar.ham override
'eggs and ham'
>>> Bar().ham = 'foo'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
请注意,我只更换了spam
getter ,同时保留了setter。 Bar.ham
setter不存在,我替换了Foo.ham
属性批发。