ホームページ > バックエンド開発 > Python チュートリアル > Python のクラスメソッドで `property()` を使用できない理由とその回避策は何ですか?

Python のクラスメソッドで `property()` を使用できない理由とその回避策は何ですか?

DDD
リリース: 2024-12-12 21:28:12
オリジナル
230 人が閲覧しました

Why Can't I Use `property()` with Classmethods in Python, and What Are the Workarounds?

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

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