4

ドキュメントによると、結合@propertyして機能@abc.abstractmethodするはずなので、python3.3で次のように機能するはずです。

import abc

class FooBase(metaclass=abc.ABCMeta):

    @property
    @abc.abstractmethod
    def greet(self):
        """ must be implemented in order to instantiate """
        pass

    @property
    def greet_comparison(self):
        """ must be implemented in order to instantiate """
        return 'hello'

class Foo(FooBase):
    def greet(self):
        return 'hello'

実装をテストします。

In [6]: foo = Foo()
In [7]: foo.greet
Out[7]: <bound method Foo.greet of <__main__.Foo object at 0x7f935a971f10>>

In [8]: foo.greet()
Out[8]: 'hello'

したがって、明らかにプロパティではありません。そのように機能するはずだからです。

In [9]: foo.greet_comparison
Out[9]: 'hello'

たぶん私は愚かなのか、単にうまくいかないのか、誰かがアイデアを持っていますか?

4

1 に答える 1

8

greetプロパティになりたい場合でも@property、実装でデコレータを使用する必要があります。

class Foo(FooBase):
    @property
    def greet(self):
        return 'hello'

ABCメタクラスが行うことは、具象クラスに同じ名前を指定したかどうかをテストすることだけです。それがメソッドであるか、プロパティであるか、通常の属性であるかは関係ありません。

気にしないので、魔法のようにpropertyデコレータを適用することもありません。これは良いことです。おそらく特定の実装では、静的属性で要件を満たすのに十分であり、プロパティは過剰になります。

ABCメタクラスの目的は、実装のギャップを検出するのに役立つことです。属性のタイプを強制することを意図したものではありません。

@propertyPython 3.3より前では、をと組み合わせることはできないことに注意してください@abstractmethod。代わりに@abstractpropertyデコレータを使用する必要があります。その場合、プロパティに単純なゲッター以上のものが必要な場合は、あいまいさがあります。Python 3.3は、そのケースをはるかにうまくカバーします(苦痛な詳細については、問題11610を参照してください)。

于 2013-02-03T09:38:09.940 に答える