classmethod での property() の使用: 探索
Python では、property() 関数はゲッターとセッターの作成において重要な役割を果たします。クラス属性の場合。ただし、@classmethod デコレータで修飾されたクラスメソッドで property() を使用しようとすると、予期しないエラーが発生する可能性があります。
この問題を説明する次のコード スニペットを考えてみましょう。
class Foo(object): _var = 5 @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value var = property(getvar, setvar)
Foo クラスのインスタンスの var 属性にアクセスまたは設定しようとすると、次のような問題が発生します。エラー:
>>> f = Foo() >>> f.getvar() 5 >>> f.setvar(4) >>> f.getvar() 4 >>> f.var Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'classmethod' object is not callable
ドキュメントおよびスタック オーバーフローのディスカッションで説明されているように [セッターおよびゲッターとしての Python クラス メソッド](https://stackoverflow.com/questions/27906399/python-class-method-as) -setter-and-getter)、Python 3.8 のクラスメソッドで property() 関数を使用することはできません。
ただし、目的の機能を実現する別のアプローチもあります。
Python 2 および Python 3 (3.9 ~ 3.10 を含む) の場合:
プロパティはインスタンスに影響しますが、クラスプロパティはクラス上に作成されるので、クラス上にプロパティを作成する必要があります。 metaclass.
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)
3.9 以降の Python バージョンの場合:
よりクリーンな解決策には、クラスメソッドをメタクラスに移動し、メタクラスでプロパティを直接宣言することが含まれます。
class Foo_meta(type): @property def var(cls): return cls._var @var.setter def var(cls, value): cls._var = value class Foo(metaclass=Foo_meta): _var = 5
これらの代替メソッドにより、クラスレベルのプロパティ。
以上がPython のクラスメソッドで `property()` を使用できない理由とその回避策は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。