Heim > Backend-Entwicklung > Python-Tutorial > Warum kann ich „property()' nicht mit Klassenmethoden in Python verwenden und welche Problemumgehungen gibt es?

Warum kann ich „property()' nicht mit Klassenmethoden in Python verwenden und welche Problemumgehungen gibt es?

DDD
Freigeben: 2024-12-12 21:28:12
Original
231 Leute haben es durchsucht

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

Property() mit Klassenmethode verwenden: Eine Erkundung

In Python spielt die Funktion property() eine entscheidende Rolle beim Erstellen von Gettern und Settern für Klassenattribute. Der Versuch, property() mit Klassenmethoden zu verwenden, die mit dem @classmethod-Dekorator dekoriert sind, kann jedoch zu unerwarteten Fehlern führen.

Betrachten wir den folgenden Codeausschnitt, der das Problem veranschaulicht:

class Foo(object):
    _var = 5

    @classmethod
    def getvar(cls):
        return cls._var

    @classmethod
    def setvar(cls, value):
        cls._var = value

    var = property(getvar, setvar)
Nach dem Login kopieren

Beim Versuch, auf das var-Attribut einer Instanz der Foo-Klasse zuzugreifen oder es festzulegen, stoßen wir auf ein Fehler:

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

Wie in der Dokumentation und in den Diskussionen zum Stapelüberlauf erläutert [Python-Klassenmethode als Setter und Getter](https://stackoverflow.com/questions/27906399/python-class-method-as -setter-and-getter) ist es nicht möglich, die Funktion property() mit Klassenmethoden in Python 3.8 und zu verwenden früher.

Es gibt jedoch alternative Ansätze, um die gewünschte Funktionalität zu erreichen:

Für Python 2 und Python 3 (einschließlich 3.9-3.10):

Da sich eine Eigenschaft auf eine Instanz auswirkt, eine Klasseneigenschaft jedoch für die Klasse erstellt wird, ist es erforderlich, die Eigenschaft für die Klasse zu erstellen Metaklasse.

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

Für Python-Versionen ab 3.9:

Eine sauberere Lösung besteht darin, die Klassenmethoden in die Metaklasse zu verschieben und die Eigenschaft direkt in der Metaklasse zu deklarieren:

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

Diese alternativen Methoden ermöglichen effektiv die Verwendung von Eigenschaften auf Klassenebene.

Das obige ist der detaillierte Inhalt vonWarum kann ich „property()' nicht mit Klassenmethoden in Python verwenden und welche Problemumgehungen gibt es?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage