`@classmethod` で装飾されたメソッドとともに `property()` を使用すると、Python でエラーが発生するのはなぜですか?

DDD
リリース: 2024-11-27 05:46:17
オリジナル
509 人が閲覧しました

Why Does Using `property()` with `@classmethod` Decorated Methods Cause Errors in Python?

クラス メソッドでの property() の使用

問題:

で装飾されたクラス メソッドでの 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート