I'estou tentando entender o uso de super()
. Pelo aspecto, ambas as classes de crianças podem ser criadas, muito bem.
I'estou curioso para saber sobre a diferença real entre as 2 seguintes classes de crianças.
class Base(object):
def __init__(self):
print "Base created"
class ChildA(Base):
def __init__(self):
Base.__init__(self)
class ChildB(Base):
def __init__(self):
super(ChildB, self).__init__()
ChildA()
ChildB()
super()
permite que você evite se referir explicitamente à classe base, o que pode ser legal. Mas a principal vantagem vem com herança múltipla, onde todos os tipos de coisas divertidas podem acontecer. Veja os docs padrão no super se você ainda não o fez.
Note que a sintaxe mudou em Python 3.0: você pode apenas dizer super().__init__()
ao invés de super(ChildB, self).__init__()
o que IMO é um pouco mais agradável. Os documentos padrão também se referem a um guia para utilizar super() que é bastante explicativo.
Apenas um aviso... com Python 2.7, e eu acredito que desde que super()
foi introduzido na versão 2.2, você só pode chamar super()
se um dos pais herdar de uma classe que eventualmente herda o objeto
(classes de novo estilo).
Pessoalmente, quanto ao código python 2.7, vou continuar utilizando BaseClassName.__init__(self, args)
até que eu realmente tenha a vantagem de utilizar super()
.
Não há, na verdade. O super()
olha para a próxima classe no MRO (ordem de resolução do método, acessado com cls.__mro__
) para chamar os métodos. Apenas chamando a base __init__'' chama a base
init'. Acontece que o MRO tem exatamente um item -- a base. Então você está realmente fazendo exatamente a mesma coisa, mas de uma maneira mais agradável com super()
(particularmente se você entrar em herança múltipla mais tarde).