問題:
で装飾されたクラス メソッドでの property() 関数の使用@classmethod デコレーターはエラーになります。
例再現:
class Foo(object): _var = 5 @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value var = property(getvar, setvar)
エラー:
>>> f = Foo() >>> f.getvar() 5 >>> f.setvar(4) >>> f.getvar() 4 >>> f.var Traceback (most recent call last): File <stdin>, line 1, in ? TypeError: 'classmethod' object is not callable >>> f.var=5 Traceback (most recent call last): File <stdin>, line 1, in ? TypeError: 'classmethod' object is not callable
解決策:
Python 3.8そして以降:
Python 3.8 以降では、@classmethod で装飾された関数で property() 関数を使用できます。両方のデコレータをメソッドに適用するだけです。
Python 2 および Python 3 (3.9 ~ 3.10 でも動作します)
プロパティはクラス上に作成されますが、インスタンスに影響します。 。クラスメソッド プロパティを作成するには、メタクラスにプロパティを作成します。
class foo(object): _var = 5 class __metaclass__(type): # Python 2 syntax for metaclasses pass @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value
>>> foo.__metaclass__.var = property(foo.getvar.im_func, foo.setvar.im_func) >>> foo.var 5 >>> foo.var = 3 >>> foo.var 3
以上が`@classmethod` で装飾されたメソッドとともに `property()` を使用すると、Python でエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。