クラス プロパティの作成方法
クラス プロパティは、クラスのインスタンスを通じてではなく、クラス自体を通じて属性にアクセスする便利な方法です。クラス。 Python では、@classmethod デコレータを使用してメソッドをクラスに追加できますが、プロパティにはそのようなデコレータがありません。ただし、同様の効果はカスタム記述子クラスを通じて実現できます。
カスタム記述子クラス
次のコードは、カスタム記述子クラス ClassPropertyDescriptor を定義します。クラス プロパティの:
class ClassPropertyDescriptor(object): def __init__(self, fget, fset=None): self.fget = fget self.fset = fset def __get__(self, obj, klass=None): if klass is None: klass = type(obj) return self.fget.__get__(obj, klass)() def __set__(self, obj, value): if not self.fset: raise AttributeError("can't set attribute") type_ = type(obj) return self.fset.__get__(obj, type_)(value) def setter(self, func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) self.fset = func return self
クラス プロパティDecorator
クラス プロパティの作成を簡素化するために、デコレータ関数 classproperty が定義されています。
def classproperty(func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) return ClassPropertyDescriptor(func)
使用例
以下このコードは、classproperty デコレーターを使用して、Bar 内に bar という名前のクラス プロパティを定義する方法を示しています。 class:
class Bar(object): _bar = 1 @classproperty def bar(cls): return cls._bar @bar.setter def bar(cls, value): cls._bar = value
Metaclass
クラスを介してクラス プロパティを直接設定できるようにするには、メタクラス定義 ClassPropertyMetaClass が使用されます。
class ClassPropertyMetaClass(type): def __setattr__(self, key, value): if key in self.__dict__: obj = self.__dict__.get(key) if obj and type(obj) is ClassPropertyDescriptor: return obj.__set__(self, value) return super(ClassPropertyMetaClass, self).__setattr__(key, value)
Bar クラス定義に __metaclass__ を追加し、その __set__ メソッドを更新します。 ClassPropertyDescriptor では、クラス自体を通じてクラス プロパティを設定する機能が有効になります。
以上が専用のデコレータを使用せずに Python でクラス プロパティを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。