Entendendo Python super() com métodos __init__()
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()
2357
3
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 desuper(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 chamarsuper()
se um dos pais herdar de uma classe que eventualmente herda oobjeto
(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 utilizarsuper()
.Não há, na verdade. O
super()
olha para a próxima classe no MRO (ordem de resolução do método, acessado comcls.__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 comsuper()
(particularmente se você entrar em herança múltipla mais tarde).