En Python, considere que tengo el siguiente 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?
¿Cómo inicializo el SuperClass __init__
en la subclase? Estoy siguiendo el tutorial de Python y no cubre eso. Cuando busqué en Google, encontré más de una forma de hacerlo. ¿Cuál es la forma estándar de manejar esto?
__init__
.A partir de python 3.5.2, puede usar:
https://docs.python.org/3/library/functions.html#super
fuente
Use un
super
objeto para asegurarse de obtener el siguiente método (como método enlazado) en el orden de resolución del método. En Python 2, debe pasar el nombre de la clase yself
super para buscar el__init__
método enlazado :En Python 3, hay un poco de magia que hace
super
innecesarios los argumentos , y como beneficio adicional funciona un poco más rápido:Codificar al padre de la siguiente manera evita que use la herencia múltiple cooperativa:
Tenga en cuenta que
__init__
solo puede regresarNone
: está destinado a modificar el objeto en el lugar.Alguna cosa
__new__
Hay otra forma de inicializar instancias, y es la única forma de subclases de tipos inmutables en Python. Por lo que es necesario si desea subclase
str
otuple
u otro objeto inmutable.Puede pensar que es un método de clase porque obtiene un argumento de clase implícito. Pero en realidad es un método estático . Así que hay que llamar
__new__
concls
forma explícita.Por lo general, devolvemos la instancia
__new__
, por lo que si lo hace, también debe llamar a su base a__new__
travéssuper
de su clase base. Entonces, si usa ambos métodos:Python 3 esquiva un poco la rareza de las súper llamadas causadas por
__new__
ser un método estático, pero aún debe pasarcls
al__new__
método no vinculado :fuente