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