Heim >Backend-Entwicklung >Python-Tutorial >Warum verursacht die Verwendung von „property()' mit „@classmethod'-dekorierten Methoden Fehler in Python?
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)
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
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
>>> foo.__metaclass__.var = property(foo.getvar.im_func, foo.setvar.im_func) >>> foo.var 5 >>> foo.var = 3 >>> foo.var 3
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!