¿Cómo inicializo la clase base (super)?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
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 y self
super para buscar el __init__
método enlazado :
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
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:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
Codificar al padre de la siguiente manera evita que use la herencia múltiple cooperativa:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
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
o tuple
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__
con cls
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és super
de su clase base. Entonces, si usa ambos métodos:
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
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 pasar cls
al __new__
método no vinculado :
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')
__init__
.