Magic methods

Ereditati da object

  • __getattribute__: invocato per gli accessi in lettura
  • __getattr__: invocato quando __getattribute__ ha una miss
  • __setattr__: definisce o cambia il valore di un attributo in ricerca attributi

Rappresentazione di un oggetto

  • __str__: viene utilizzato quando si chiama un oggetto object
  • __repr__: viene utilizzato quando si utilizza print(object)

__call__: da la possibilità di essere ‘chiamabile’, e quindi di agire come una funzione [[Metaprogrammazione#call|call]]

__get__(self, obj, objtype=None) __set__(self, obj, value) __delete__(self, obj)

__doc__: rappresenta la stringa per la documentazione

Attenzione: non fare override utilizzando la stessa funzione (eg: __eq__ con all’interno ==) __eq__: equal __ne__: not equal __lt__: less than __le__: less than or equal

__add__: somma __sub__ __mul__ __truediv__ __floordiv__ __mod__

Attenzione Dal momento che il simbolo di operazione è zucchero sintattico, il metodo che viene chiamato è quello del primo membro dell’operazione. Ad esempio, in op1+op2 equivale a op1.__add__(op2). #python_book8

class weakint(int):
    '''Numeri interi che "supportano" l'addizione con cast implicito di argomenti
       non conformi nel tipo
    '''
    def __add__(self,other):
        try:
            other = int(other)
        except ValueError:
            other = 0
        return super().__add__(other)
 
weakint(2) + '7' = 2	# e fin qui nessun problema
'7' + weakint(2)		# qui nasce il problema per la questione spiegata sopra

Per far fronte alla apparente assenza della proprietà commutativa, il compilatore, prima di eseguire l’operazione, controlla se nell’oggetto di destra è presente una funzione __radd__, che implementa la addizione da destra. Se c’è viene utilizzata.

# si inserisce questo nella classe weaking, e tutto funziona
	__radd__ = __add__
 
'7' + weakint(2) = 2	# no problem

Contenitori

__getitem__ __setitem__ __delitem__ __len__ __contains__ __iter__

Rappresentazione

__str__ __repr__ __format__ __hash__