Olá, boa noite! Ainda não consegui entender o motivo da necessidade de chamar o construtor super().
class Playlist(list):
def __init__(self, nome, programas):
self.nome = nome
super().__init__(programas)
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Olá, boa noite! Ainda não consegui entender o motivo da necessidade de chamar o construtor super().
class Playlist(list):
def __init__(self, nome, programas):
self.nome = nome
super().__init__(programas)
O super() chama a classe "pai", que no caso é o list. Então você está acessando o construtor do list.
Sem isso, você até teria as funcionalidades do list, mas não teria inicializado o valor.
Exemplo:
class MyList(list):
def __init__(self, name):
self.name = name
oo = MyList('Lista')
print(oo.name)
print(oo)
print(len(oo))
oo.append('valor')
print(oo)
print(len(oo))
continuo com a mesma duvida acerca do super()
Sem problemas. Usando o código que o Ramon fez, fiz alguns exemplos:
class Playlist(list):
def __init__(self, nome, programas):
self.nome = nome
super().__init__(programas)
class PlaylistSemSuper(list):
def __init__(self, nome, programas):
self.nome = nome
self.programas = programas
class PlaySemList:
def __init__(self, nome, programas):
self.nome = nome
self.programas = programas
playlist = Playlist('foo', ['filme', 'série', 'novela'])
print(playlist.nome, playlist)
# Resposta: foo ['filme', 'série', 'novela']
playlist = PlaylistSemSuper('foo', ['filme', 'série', 'novela'])
print(playlist.nome, playlist, playlist.programas)
# Resposta: foo [] ['filme', 'série', 'novela']
playlist = PlaySemList('foo', ['filme', 'série', 'novela'])
print(playlist.nome, playlist, playlist.programas)
# Resposta: foo <__main__.PlaySemList object at 0x10ab06fa0> ['filme', 'série', 'novela']
Nesses 3 exemplos que foram passados, podemos ver que só quem estendeu o list (usando (list)), se comporta como uma list. Também vimos que só quem usou o super(), teve o valor iniciado. No caso, o PlaylistSemSuper tem o comportamento de list, mas não iniciou o valor, e por isso está como uma list vazia. Basicamente você usa o super() para poder acessar coisas da classe que está estendendo.
Segue um outro exemplo que explora o uso de múltiplas classes e os métodos delas:
class Cachorro:
def latir(self):
print("au")
def fazer_barulho(self):
self.latir()
class Gato:
def miar(self):
print('miai')
def fazer_barulho(self):
self.miar()
class Quimera(Cachorro, Gato):
def fazer_barulho(self):
super().fazer_barulho()
super().miar()
super().latir()
quimera = Quimera()
quimera.fazer_barulho()
# Resultado: au
# miai
# au