Maison >développement back-end >Tutoriel Python >Pourquoi l'utilisation de `property()` avec les méthodes décorées `@classmethod` provoque-t-elle des erreurs en Python ?

Pourquoi l'utilisation de `property()` avec les méthodes décorées `@classmethod` provoque-t-elle des erreurs en Python ?

DDD
DDDoriginal
2024-11-27 05:46:17519parcourir

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

Utilisation de property() avec des méthodes de classe

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn