クラスメソッドでの property() の使用
Python は、計算される読み取り専用または読み取り/書き込み属性を作成するための property() デコレーターを提供しますダイナミックに。ただし、クラスメソッドと組み合わせると、このアプローチにはいくつかの制限があります。
Python バージョン 3.8 以降では、property() デコレータをクラスメソッドに直接適用できるため、クラス属性に簡潔にアクセスできます。
class Foo: _var = 5 @classmethod @property def var(cls): return cls._var @classmethod @var.setter def var(cls, value): cls._var = value
ただし、Python 2 および Python 3 の 3.8 より前のバージョンでは、別のアプローチが必要です。プロパティはインスタンス上で定義されるため、クラスメソッドでプロパティを使用するには、クラスのメタクラス上にプロパティを作成する必要があります。
class Foo(object): _var = 5 class __metaclass__(type): def __init__(cls, name, bases, dict): super().__init__(name, bases, dict) cls.var = property(cls.getvar, cls.setvar) @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value
この例では、__metaclass__ はメタクラス上にプロパティを定義し、その後、そのプロパティは、 Foo class.
または、メタクラス パラメータを使用してカスタム クラスを定義することもできます。メタクラス:
class FooMeta(type): def __init__(cls, name, bases, dict): super().__init__(name, bases, dict) cls._var = 5 cls.var = property(cls.getvar, cls.setvar) @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value class Foo(metaclass=FooMeta): pass
この設定では、メタクラスは _var 属性を初期化し、var プロパティを定義します。 Foo のインスタンスは var プロパティを継承し、それに応じて _var 属性にアクセスできるようになります。
以上がPython のクラスメソッドで `property()` デコレーターを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。