No Python, considere que tenho o seguinte código:
>>> class SuperClass(object):
def __init__(self, x):
self.x = x
>>> class SubClass(SuperClass):
def __init__(self, y):
self.y = y
# how do I initialize the SuperClass __init__ here?
Como inicializo o SuperClass __init__
na subclasse? Estou seguindo o tutorial do Python e ele não cobre isso. Quando pesquisei no Google, encontrei mais de uma maneira de fazer. Qual é a maneira padrão de lidar com isso?
__init__
.No python 3.5.2, você pode usar:
https://docs.python.org/3/library/functions.html#super
fonte
Use um
super
objeto para garantir que você obtenha o próximo método (como método vinculado) na ordem de resolução do método. No Python 2, você precisa passar o nome da classe eself
super para pesquisar o__init__
método bound :No Python 3, há um pouco de mágica que torna os argumentos
super
desnecessários - e, como benefício colateral, funciona um pouco mais rápido:A codificação codificada do pai como esta abaixo impede que você use herança múltipla cooperativa:
Observe que
__init__
só pode retornarNone
- ele pretende modificar o objeto no local.Alguma coisa
__new__
Há outra maneira de inicializar instâncias - e é a única maneira de subclasses de tipos imutáveis no Python. Por isso é necessário se você quiser subclasse
str
outuple
ou outro objeto imutável.Você pode pensar que é um método de classe porque obtém um argumento implícito de classe. Mas na verdade é um método estático . Então, você precisa chamar
__new__
comcls
explicitamente.Normalmente retornamos a instância de
__new__
, portanto, se você o fizer, também precisará chamar a__new__
viasuper
da sua base também na sua classe base. Portanto, se você usar os dois métodos:O Python 3 evita um pouco da estranheza das super chamadas causadas por
__new__
ser um método estático, mas você ainda precisa passarcls
para o__new__
método não vinculado :fonte