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
Libérer: 2024-11-27 05:46:17
original
586 Les gens l'ont consulté

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)
Copier après la connexion

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
Copier après la connexion

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
    
Copier après la connexion
>>> foo.__metaclass__.var = property(foo.getvar.im_func, foo.setvar.im_func)
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal