3
respostas

Dúvida - super()

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)
3 respostas

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