Ho visto alcune domande su questo argomento, ma non sono stato in grado di trovare una risposta definitiva.Come si mischiano le classi Python vecchio stile e nuovo stile?
Mi piacerebbe conoscere il modo corretto di utilizzare le classi vecchio stile in un nuovo codice in Python. Diciamo ad esempio che ho due classi fisse, A e B. Se voglio sottoclasse A e B, e convertire in classi di nuovo stile (A2 e B2), questo funziona. Tuttavia c'è un problema se voglio creare una nuova classe C, da A2 e B2.
Pertanto, è possibile continuare con questo metodo o tutte le classi devono essere conformi al vecchio stile se una qualsiasi classe di base è definita come vecchio stile?
Vedere il codice di esempio per chiarire:
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()
L'output di questo codice:
class A
class A2
---
class B
class B2
---
class A
class A2
class C
Come si può vedere, il problema è che nella chiamata a C()
, classe B2 non è mai stato inizializzato.
Update - New-Style Class Esempio
credo che non è chiaro quale sia la sequenza di inizializzazione corretta dovrebbe essere quando si utilizza super
. Ecco un esempio funzionante in cui una chiamata a super fa inizializza tutte le classi base, non solo la prima trova.
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()
e produce l'uscita:
class B
class B2
class A
class A2
class C
Risposta aggiornata per includere la spiegazione dell'ereditarietà del diamante e il problema risolto con le classi di nuovo stile. –
Perché hai addirittura classi vecchio stile in primo luogo? –
Moduli di terze parti, forse? –