gpt4 book ai didi

python - Python 的 property.getter 的用途是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:29 25 4
gpt4 key购买 nike

由于 Python 力求只有一种正确的方法,所以我想知道 property.getter 的目的是什么。在这个例子中,WhyMe 定义了一个 getter 但 Other 没有,所以我想知道 property.getter 的意义何在仅仅使用属性。

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

我对属性并不陌生,我只是想知道制作 setter/getter 是否有一些优势,或者是否只是为了对称而放在那里?

最佳答案

@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 属性批发。

关于python - Python 的 property.getter 的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14138580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com