Maison > développement back-end > Tutoriel Python > Comment puis-je utiliser le décorateur `property()` avec des méthodes de classe en Python ?

Comment puis-je utiliser le décorateur `property()` avec des méthodes de classe en Python ?

Patricia Arquette
Libérer: 2024-11-27 00:48:14
original
893 Les gens l'ont consulté

How Can I Use the `property()` Decorator with Classmethods in Python?

Utilisation de property() sur Classmethods

Python fournit le décorateur property() pour créer des attributs en lecture seule ou en lecture-écriture qui sont calculés dynamiquement. Cependant, lorsqu'elle est combinée avec des méthodes de classe, cette approche se heurte à certaines limites.

Dans les versions 3.8 et ultérieures de Python, le décorateur property() peut être appliqué directement aux méthodes de classe, permettant un accès concis aux attributs de classe :

class Foo:
    _var = 5
    @classmethod
    @property
    def var(cls):
        return cls._var

    @classmethod
    @var.setter
    def var(cls, value):
        cls._var = value
Copier après la connexion

Cependant, dans Python 2 et les versions de Python 3 antérieures à 3.8, une approche différente est requise. Puisque les propriétés sont définies sur des instances, les utiliser avec des méthodes de classe implique de créer la propriété sur la métaclasse de la classe :

class Foo(object):
    _var = 5

    class __metaclass__(type):
        def __init__(cls, name, bases, dict):
            super().__init__(name, bases, dict)
            cls.var = property(cls.getvar, cls.setvar)

        @classmethod
        def getvar(cls):
            return cls._var

        @classmethod
        def setvar(cls, value):
            cls._var = value
Copier après la connexion

Dans cet exemple, la __metaclass__ définit la propriété sur la métaclasse, qui est ensuite héritée par les instances de la classe. Classe Foo.

Vous pouvez également utiliser le paramètre métaclasse pour définir un paramètre personnalisé métaclasse :

class FooMeta(type):
    def __init__(cls, name, bases, dict):
        super().__init__(name, bases, dict)
        cls._var = 5
        cls.var = property(cls.getvar, cls.setvar)

    @classmethod
    def getvar(cls):
        return cls._var

    @classmethod
    def setvar(cls, value):
        cls._var = value

class Foo(metaclass=FooMeta):
    pass
Copier après la connexion

Dans cette configuration, la métaclasse initialise l'attribut _var et définit la propriété var. Les instances de Foo hériteront de la propriété var et pourront accéder à l'attribut _var en conséquence.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal