Considera questo: una classe base A, una classe B che eredita da A, una classe C che eredita da B. Qual è un modo generico per chiamare un costruttore della classe genitore in un costruttore? Se questo sembra ancora troppo vago, ecco un codice.Costruttori genitore di chiamate in catena in python
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
super(B,self).__init__()
print "Constructor B was called"
class C(B):
def __init__(self):
super(C,self).__init__()
print "Constructor C was called"
c = C()
Ecco come lo faccio ora. Ma sembra ancora un po 'troppo generico - devi ancora passare un tipo corretto a mano.
Ora, ho provato a usare self.__class__
come un primo argomento a super(), ma, ovviamente, non funziona - se lo si inserisce nel costruttore per C - abbastanza corretto, viene chiamato il costruttore di B. Se fai lo stesso in B, "self" punta ancora a un'istanza di C così finisci per chiamare di nuovo il costruttore di B (questo termina con una ricorsione infinita).
Non c'è bisogno di pensare all'ereditarietà del diamante per ora, sono solo interessato a risolvere questo problema specifico.
"Ma sembra ancora un po 'troppo non generico - si ancora deve passare un tipo corretto a mano. "?? Stai passando il nome della classe a super(). Non hai mai bisogno di conoscere la superclasse o qualsiasi altra cosa. Come è questo non generico? Che problema crea? Puoi dare un esempio dove questo si rompe? –
Non sono pronto a rispondere a questa domanda se è completo. Ma comunque, cosa succede se la classe viene ribattezzata? Cosa succede se voglio scrivere una funzione di decoratore per automatizzare questo tipo di concatenamento? Ora vedo che non è possibile, ma al momento di fare la domanda non lo sapevo. – shylent