Python Language Descripteur simple


Exemple

Il existe deux types de descripteurs différents. Les descripteurs de données sont définis comme des objets définissant à la fois une __get__() et une __set__() , tandis que les descripteurs autres que des données définissent uniquement une __get__() . Cette distinction est importante lorsque l’on considère les substitutions et l’espace de noms du dictionnaire d’une instance. Si un descripteur de données et une entrée du dictionnaire d'une instance partagent le même nom, le descripteur de données aura la priorité. Cependant, si à la place un descripteur de non-données et une entrée du dictionnaire d'une instance partagent le même nom, l'entrée du dictionnaire d'instance est prioritaire.

Pour créer un descripteur de données en lecture seule, définissez à la fois get () et set () avec set () en levant un AttributeError lorsqu'il est appelé. Définir la méthode set () avec un espace réservé de levée d'exception suffit pour en faire un descripteur de données.

descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None

Un exemple implémenté:

class DescPrinter(object):
    """A data descriptor that logs activity."""
    _val = 7
    
    def __get__(self, obj, objtype=None):
        print('Getting ...')
        return self._val

    def __set__(self, obj, val):
        print('Setting', val)
        self._val = val
    
    def __delete__(self, obj):
        print('Deleting ...')
        del self._val


class Foo():
    x = DescPrinter()       

i = Foo()
i.x
# Getting ...
# 7

i.x = 100
# Setting 100
i.x
# Getting ...
# 100

del i.x
# Deleting ...
i.x
# Getting ...
# 7