Seite 1 von 1

super() mit self.__class__ ???

Verfasst: Samstag 7. Oktober 2006, 22:41
von jens
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.

Verfasst: Sonntag 8. Oktober 2006, 00:17
von rayo
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

Verfasst: Sonntag 8. Oktober 2006, 09:39
von jens
Schade :)

Aber gibt es keine andere Möglichkeit?

Verfasst: Sonntag 8. Oktober 2006, 10:50
von birkenfeld
Es gibt diverse Metaklassen, die das tun. Such im Python Cookbook nach "super" oder "autosuper".

Verfasst: Sonntag 8. Oktober 2006, 11:14
von BlackJack
Oder man vermeidet Vererbungshierarchien mit Mehrfachvererbung in "Diamantenform" und vergisst ``super()``.

Verfasst: Sonntag 8. Oktober 2006, 12:11
von mitsuhiko

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()

Verfasst: Sonntag 8. Oktober 2006, 12:16
von mitsuhiko
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