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()
Solução

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.

Comentários (5)

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().

Comentários (2)

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 baseinit'. 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).

Comentários (6)