Remarques sur l'ajout de setter et deleter dans une classe dérivée à la propriété getter de la classe de base

L'exemple suivant montre comment ajouter un setter dans une classe dérivée à la propriété getter «x» de la classe de base «Foo».


class Foo:
    
    def __init__(self):
        self._x = "I'm Foo.x"
    
    @property
    def x(self):
        return self._x
    
class Bar(Foo):
  
    @Foo.x.setter
    def x(self, value):
        self._x = value 

Lorsqu'il est exécuté, cela ressemble à ceci:

>>> b = Bar()

>>> b.x
"I'm Foo.x"

>>> b.x = "I'm Bar.x"

>>> b.x
"I'm Bar.x"

De plus, si vous souhaitez ajouter un suppresseur, écrivez comme suit.

class Foo:
    
    def __init__(self):
        self._x = "I'm Foo.x"
    
    @property
    def x(self):
        return self._x
    
    
class Bar(Foo):

    @Foo.x.setter
    def x(self, value):
        self._x = value 
        
    @x.deleter
    def x(self):
        self._x = "Nothing"

Une fois exécuté, ce sera comme suit.

>>> b = Bar()

>>> b.x
"I'm Foo.x"

>>> b.x = "I'm Bar.x"

>>> b.x
"I'm Bar.x"

>>> del b.x
'Nothing'

Notez que le dernier décorateur est @ x.deleter, pas @ Foo.x.deleter. Si vous faites @ Foo.x.deleter, une propriété sans setter sera générée.

La méthode deleter de l'objet property renvoie un nouvel objet property avec la fonction d'argument ajoutée au deleter. Foo.x est un objet de propriété qui n'a qu'un getter property avec une définition commençant par @ Foo.x.setter décorateur de Bar, avec getter et setter dans Bar.x Puisque l'objet a été créé et attribué, @ x.deleter ajoutera le suppresseur en plus du getter et du setter.

référence

Recommended Posts

Remarques sur l'ajout de setter et deleter dans une classe dérivée à la propriété getter de la classe de base
Précautions lors du passage de def aux fonctions triées et groupby en Python? ??
Précautions lors de l'ajout d'éléments à l'aide de DateField à un modèle existant ultérieurement dans Django
Différences de comportement entre les opérateurs append () et "+ =" lors de l'ajout de données à une liste en Python
setter et getter
Conseils et précautions lors du portage des programmes MATLAB vers Python
Exemple d'obtention du nom du module et du nom de la classe en Python