Problème :
Utilisation de la fonction property() avec des méthodes de classe décorées avec le décorateur @classmethod génère une erreur.
Exemple Reproduction :
class Foo(object): _var = 5 @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value var = property(getvar, setvar)
Erreur :
>>> 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
Solution :
Python 3.8 et versions ultérieures :
Dans Python 3.8 et versions ultérieures, il est possible d'utiliser la fonction property() avec les fonctions décorées @classmethod. Appliquez simplement les deux décorateurs à la méthode.
Python 2 et Python 3 (fonctionne également dans 3.9-3.10)
Une propriété est créée sur une classe mais affecte une instance . Pour créer une propriété de méthode de classe, créez la propriété sur la métaclasse.
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!