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
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 7. Oktober 2006, 22:41

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.

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

Sonntag 8. Oktober 2006, 00:17

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
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 8. Oktober 2006, 09:39

Schade :)

Aber gibt es keine andere Möglichkeit?

CMS in Python: http://www.pylucid.org
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

Sonntag 8. Oktober 2006, 10:50

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

Sonntag 8. Oktober 2006, 11:14

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:

Sonntag 8. Oktober 2006, 12:11

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:

Sonntag 8. Oktober 2006, 12:16

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