So erstellen Sie eine Klasseneigenschaft
Eine Klasseneigenschaft ist eine bequeme Möglichkeit, über die Klasse selbst auf Attribute zuzugreifen und nicht über Instanzen der Klasse Klasse. In Python können einer Klasse mithilfe des @classmethod-Dekorators Methoden hinzugefügt werden, es gibt jedoch keinen solchen Dekorator für Eigenschaften. Ein ähnlicher Effekt kann jedoch durch eine benutzerdefinierte Deskriptorklasse erzielt werden.
Benutzerdefinierte Deskriptorklasse
Der folgende Code definiert eine benutzerdefinierte Deskriptorklasse, ClassPropertyDescriptor, die die Erstellung ermöglicht von Klasseneigenschaften:
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
Class Property Decorator
Um die Erstellung von Klasseneigenschaften zu vereinfachen, wird eine Decorator-Funktion classproperty definiert:
def classproperty(func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) return ClassPropertyDescriptor(func)
Beispielverwendung
Der folgende Code zeigt, wie der ClassProperty Decorator verwendet wird, um eine Klasseneigenschaft namens bar in der Bar-Klasse zu definieren:
class Bar(object): _bar = 1 @classproperty def bar(cls): return cls._bar @bar.setter def bar(cls, value): cls._bar = value
Metaklasse
Um das direkte Festlegen von Klasseneigenschaften über die Klasse zu ermöglichen, wird eine Metaklassendefinition, ClassPropertyMetaClass, verwendet:
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)
Durch Hinzufügen von __metaclass__ zur Bar-Klassendefinition und Aktualisieren der __set__-Methode von ClassPropertyDescriptor wird die Möglichkeit aktiviert, Klasseneigenschaften über die Klasse selbst festzulegen.
Das obige ist der detaillierte Inhalt vonWie erstelle ich Klasseneigenschaften in Python ohne einen speziellen Dekorator?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!