super() mit self.__class__ ???

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Normalerweise trägt man ja den Namen der Klasse manuell in super() ein. Also z.B. so:

Code: Alles auswählen

class detect_page(PyLucidBaseModule):
    def __init__(self, *args, **kwargs):
        super(detect_page, self).__init__(*args, **kwargs)
Aber es würde doch auch mit self.__class__ gehen, so:

Code: Alles auswählen

class detect_page(PyLucidBaseModule):
    def __init__(self, *args, **kwargs):
        super(self.__class__, self).__init__(*args, **kwargs)
Was spricht dagegen??? Ich meine ist doch flexibler, wenn man den Namen der Klasse ändert, oder z.B. die __init__ Methode per Copy&Paste woanders verwendet.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Nein das ist nicht dasselbe.

Code: Alles auswählen

class A(object):
    def __init__(self):
        print 'A',self.__class__

class B(A):
    def __init__(self):
        print 'B',self.__class__
        super(B, self).__init__()

class C(B):
    def __init__(self):
        print 'C',self.__class__
        super(C, self).__init__()


c = C()
Die Ausgabe ist:

Code: Alles auswählen

C <class '__main__.C'>
B <class '__main__.C'>
A <class '__main__.C'>
Wie du siehst ist self.__class__ immer C, anstatt in B.__init__ auch die B-Klasse zu sein

Deine Version würde hier bei B super(C, self).__init__ aufrufen anstatt super(B, self).__init__

Gruss
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Schade :)

Aber gibt es keine andere Möglichkeit?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Es gibt diverse Metaklassen, die das tun. Such im Python Cookbook nach "super" oder "autosuper".
BlackJack

Oder man vermeidet Vererbungshierarchien mit Mehrfachvererbung in "Diamantenform" und vergisst ``super()``.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Code: Alles auswählen

class B(A):

    def __init__(self):
        self.__parent = super(B, self)

    def foo(self, bar):
        return self.__parent.foo(bar).upper()
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

birkenfeld hat geschrieben:Es gibt diverse Metaklassen, die das tun. Such im Python Cookbook nach "super" oder "autosuper".
Die sind aber allesamt magisch und nutzen getframe() oder tun irgendwas anders grausiges :D
TUFKAB – the user formerly known as blackbird
Antworten