eistono dei metodi speciali li riconosci dalle due __
sono metodi non vengono chiamati direttamente dal programmatore ma vengono invocati da Python in situazioni particolari

metodi: verifica
si utilizzano e si codifica i metodi per verificare se vero/falso o la lunghezza/numero elementi


esempio: utilizza anche la classe precedente Person
# definiamo una classe Team
class Team:

# definiamo un __init__ che assegna i membri all'istanza
def __init__(self, members):
self.members = members

# definiamo un __bool__ che restituisce False se il team ha 0 membri, altrimenti True
def __bool__(self):
return len(self.members) > 0

# definiamo un __len__ che restituisce il numero di membri
def __len__(self):
return len(self.members)

# definiamo un __repr__ che restituisce il tipo dell'oggetto e i nomi dei membri del team
def __repr__(self):
names = ', '.join([p.name for p in self.members])
return '<Team object [{}]>'.format(names)



# creiamo un'istanza di Team con 3 membri
t1 = Team([Person('Guido', 'van Rossum'), Person('Alex', 'Martelli'), Person('Ezio', 'Melotti')])


# verifichiamo il repr dell'oggetto
t1
<Team object [Guido, Alex, Ezio]>

# verifichiamo che il team ha 3 membri
t1.members
[<Person object (Guido van Rossum)>,
<Person object (Alex Martelli)>,
<Person object (Ezio Melotti)>]

# verifichiamo che la lunghezza del team è 3
len(t1)
3

# verifichiamo che questo team è considerato "vero"
bool(t1)
True


# creiamo un'altra istanza di Team con 0 membri
t2 = Team([])

# verifichiamo il repr dell'oggetto
t2
<Team object []>

# verifichiamo che il team ha 0 membri
t2.members
[]

# verifichiamo che la lunghezza del team è 0
len(t2)
0

# verifichiamo che questo team è considerato "falso"
bool(t2)
False