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.