He visto algunas preguntas sobre este tema, pero no he podido encontrar una respuesta definitiva.¿Cómo se mezclan las clases de Python de estilo antiguo y nuevo?
Me gustaría saber la manera correcta de utilizar las clases antiguas en una nueva base de código Python. Digamos, por ejemplo, que tengo dos clases fijas, A y B. Si quiero subclase Un y B, y convertir a las clases de nuevo estilo (A2 y B2), esto funciona. Sin embargo, existe un problema si quiero crear una nueva clase C, de A2 y B2.
Por lo tanto, ¿es posible continuar con este método, o todas las clases tienen que ajustarse al estilo antiguo si alguna clase base se define como de estilo antiguo?
ver el código de ejemplo para una aclaración:
class A:
def __init__(self):
print 'class A'
class B:
def __init__(self):
print 'class B'
class A2(A,object):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B,object):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C,self).__init__()
print 'class C'
A2()
print '---'
B2()
print '---'
C()
La salida de este código:
class A
class A2
---
class B
class B2
---
class A
class A2
class C
Como se puede ver, el problema es que en la llamada a C()
, clase B2 nunca fue inicializado
Actualización - Clase Ejemplo New-Style
supongo que no está claro cuál es la secuencia de inicialización correcta debería ser cuando se utiliza super
. Aquí hay un ejemplo de trabajo donde una llamada a super hace inicializa todas las clases base, no solo la primera encuentra.
class A(object):
def __init__(self):
super(A, self).__init__()
print 'class A'
class B(object):
def __init__(self):
super(B, self).__init__()
print 'class B'
class A2(A):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C, self).__init__()
print 'class C'
C()
y produce la salida:
class B
class B2
class A
class A2
class C
Respuesta actualizada para incluir la explicación de la herencia de diamantes y el problema resuelto con las clases de estilo nuevo. –
¿Por qué siquiera tienes clases antiguas en primer lugar? –
¿Módulos de terceros, tal vez? –