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
DDDOriginal
2024-11-27 05:46:17565Durchsuche

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)

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!

Stellungnahme:
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