Python Language Descrittore semplice


Esempio

Esistono due diversi tipi di descrittori. I descrittori di dati sono definiti come oggetti che definiscono sia un __get__() sia un __set__() , mentre i descrittori non di dati definiscono solo un __get__() . Questa distinzione è importante quando si considerano le sostituzioni e lo spazio dei nomi del dizionario di un'istanza. Se un descrittore di dati e una voce nel dizionario di un'istanza condividono lo stesso nome, il descrittore di dati avrà la precedenza. Tuttavia, se invece un descrittore non di dati e una voce nel dizionario di un'istanza condividono lo stesso nome, la voce del dizionario dell'istanza avrà la precedenza.

Per creare un descrittore di dati di sola lettura, definisci sia get () che set () con set () generando un AttributeError quando chiamato. Definire il metodo set () con un segnaposto che genera un'eccezione è sufficiente per renderlo un descrittore di dati.

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

Un esempio implementato:

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