Wie erstelle ich Klasseneigenschaften in Python ohne einen speziellen Dekorator?

Patricia Arquette
Freigeben: 2024-11-07 15:22:03
Original
410 Leute haben es durchsucht

How to create class properties in Python without a dedicated decorator?

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!