ホームページ >バックエンド開発 >Python チュートリアル >`@classmethod` で装飾されたメソッドとともに `property()` を使用すると、Python でエラーが発生するのはなぜですか?

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

DDD
DDDオリジナル
2024-11-27 05:46:17531ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。