3

Python は 1 つの正しい方法があるように努めているため、property.getter の目的は何なのか疑問に思っています。この例では、WhyMe が getter を定義していますが、Other はそうではありません。

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

私はプロパティに慣れていません。ゲッターを作成することに利点があるのか​​ 、それとも対称性のためにそこに置かれたのか疑問に思っていますか?

4

1 に答える 1

5

@propertyそのプロパティのゲッターを定義して、まったく新しいプロパティを定義しましょう。この@original.getter構文では、既存の getter だけをオーバーライドできます。.setterプロパティで使用できる他の 2 つのメソッドに加えて、および.deleterデコレータもあります。

ゲッターとセッターの両方が定義された、プロパティを使用するカスタム クラスをサブクラス化するとします。そのプロパティのゲッターのみをオーバーライドし、セッター(またはデリーター) はそのままにしておく場合は、次のように使用@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セッターが存在せず、プロパティの卸売を交換しましたFoo.ham

于 2013-01-03T12:05:23.543 に答える