Heim > Backend-Entwicklung > Python-Tutorial > Warum verursacht die Verwendung von „property()' mit „@classmethod'-dekorierten Methoden Fehler in Python?

Warum verursacht die Verwendung von „property()' mit „@classmethod'-dekorierten Methoden Fehler in Python?

DDD
Freigeben: 2024-11-27 05:46:17
Original
570 Leute haben es durchsucht

Why Does Using `property()` with `@classmethod` Decorated Methods Cause Errors in Python?

Verwendung von property() mit Klassenmethoden

Problem:

Verwendung der Funktion property() mit Klassenmethoden, die mit dekoriert sind Der @classmethod-Dekorator führt zu einem Fehler.

Beispiel Reproduktion:

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

Fehler:

>>> f = Foo()
>>> f.getvar()
5
>>> f.setvar(4)
>>> f.getvar()
4
>>> f.var
Traceback (most recent call last):
  File <stdin>, line 1, in ?
TypeError: 'classmethod' object is not callable
>>> f.var=5
Traceback (most recent call last):
  File <stdin>, line 1, in ?
TypeError: 'classmethod' object is not callable
Nach dem Login kopieren

Lösung:

Python 3.8 und später:

In Python 3.8 und Später ist es möglich, die Funktion property() mit @classmethod-dekorierten Funktionen zu verwenden. Wenden Sie einfach beide Dekoratoren auf die Methode an.

Python 2 und Python 3 (Funktioniert auch in 3.9-3.10)

Eine Eigenschaft wird für eine Klasse erstellt, wirkt sich jedoch auf eine Instanz aus . Um eine Klassenmethodeneigenschaft zu erstellen, erstellen Sie die Eigenschaft in der 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
    
Nach dem Login kopieren
>>> foo.__metaclass__.var = property(foo.getvar.im_func, foo.setvar.im_func)
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum verursacht die Verwendung von „property()' mit „@classmethod'-dekorierten Methoden Fehler in Python?. 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