Wie funktioniert die Mehrfachvererbung Arbeit mit dem super() und verschiedene __init__() Argumente?

Ich bin, Tauchen nur in einigen fortgeschrittenen python-Themen (sowie, erweitert, um mich zumindest). Ich bin jetzt beim Lesen über mehrfache Vererbung ist und wie Sie die Verwendung von super(). Ich mehr oder weniger verstehen, wie sich die super-Funktion verwendet wird, aber (1) Was ist falsch mit, es einfach zu tun, wie dies?:

class First(object):
    def __init__(self):
        print "first"

class Second(object):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        First.__init__(self)
        Second.__init__(self)
        print "that's it"

Auf super(), Andrew Kuchlings Papier auf Python Warzen sagt:

Verwendung von super() wird auch richtig sein, wenn die Abgeleitete Klasse erbt
aus mehreren Basisklassen und einige oder alle von Ihnen haben init
Methoden

So, ich schrieb das obige Beispiel wie folgt:

class First(object):
    def __init__(self):
        print "first"

class Second(object):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        super(Third, self).__init__(self)
        print "that's it"

Diese jedoch, nur läuft die erste init, die es finden kann, die in First. (2) super() werden verwendet, um sowohl die init aus First und Second, und wenn ja, wie? Läuft super(Third, self).__init__(self) zweimal nur der Zuerst ausgeführt wird.init() zweimal..

Etwas mehr Verwirrung. Was ist, wenn die vererbten Klassen " init () - Funktionen verschiedene Argumente. Was passiert zum Beispiel, wenn ich etwas wie dieses:

class First(object):
    def __init__(self, x):
        print "first"

class Second(object):
    def __init__(self, y, z):
        print "second"

class Third(First, Second):
    def __init__(self, x, y, z):
        First.__init__(self, x)
        Second.__init__(self, y, z)
        print "that's it"

(3) Wie würde ich in der Lage sein, die relevanten Argumente zu den verschiedenen Klassen geerbt init-Funktionen die Verwendung von super()?

Alle Tipps sind willkommen!

ps. Da habe ich mehrere Fragen, die ich Ihnen gemacht Fett und nummeriert Sie..

  • super(Class, self) gibt ein Objekt zurück, so sollten Sie nicht nennen Sie es mit .__init__(self), aber nur .__init__(). Sie können dies in den Antworten, aber Ihre ursprüngliche erste code gibt Ausnahme TypeError: __init__() takes exactly 1 argument (2 given).
InformationsquelleAutor kramer65 | 2013-05-31
Schreibe einen Kommentar