Rappresentazione

__str__: produce una rappresentazione human readable Implementa la funzione str. Invocata da print

__repr__: produce una rappresentazione machine readable Implementa la funzione repr. Ritorna una rappresentazione che potrebbe essere ancora compilata da Python.

Se __str__ non è definita, viene invocata __repr__.

class complex(tuple):
    '''Definisce i numeri complessi come tuple. Come esempio
       implementa solo le operazioni di addizione e prodotto.
       Definisce inoltre la rappresentazione algebrica (mediante __str__)
       e una rappresentazione machine-readable (con __repr__))'''
    def __new__(cls,re=0,im=0):
        return super().__new__(cls,(re,im))
    def __add__(self,other):
        return complex(self[0]+other[0],self[1]+other[1])
    def __mul__(self,other):
        realp = self[0]*other[0]-self[1]*other[1]
        imgp = self[0]*other[1]+self[1]*other[0]
        return complex(realp,imgp)
    def __str__(self):
        sign = '' if self[0]==0 or self[1]<=0 else '+'
        realp = '' if self[0]==0 else str(self[0])
        imgp = '' if self[1]==0 \
                  else 'i' if self[1]==1 else '-i' if self[1]==-1 else str(self[1])+'i'
        return '0' if not realp+imgp else f"{realp}{sign}{imgp}"
    def __repr__(self):
        return f"complex({self[0]},{self[1]})"

__format__ Invocata quando la rappresentazione viene invocata ad esempio in una F-string.

class nominativo:
    def __init__(self, nome, cognome):
        self.nome = nome
        self.cognome = cognome
    def __format__(self,formatstr):
        return self.cognome+formatstr+self.nome
		
f"Destinatario: {x: sig. }"

__hash__ Viene invocato come implementazione della funzione builtin hash. Conforma al protocollo hashable, quindi possono essere utilizzati come chiavi di un dizionario. Il protocollo prevede anche l’implementazione di __eq__ (per eseguire controllo esplicito, dopo aver trovaro la chiave), dal momento che valori hash diversi denotano chiavi diverse, ma non è vero il contrario.

python_book8