Neulich in PyCharm: Da hacke ich so froh vor mich hin, bastel ein Skriptchen mit zwei Klässelchen, und stelle fest, dass man Teile davon in eine gemeinsame Superklasse ziehen kann. Nichts besonderes, und weil Python ja objektorientiert konzeptioniert ist, geht das auch total einfach:
class Common(object):
def __init__(self, some):
self._some = some
class A(Common):
def __init__(self):
super(A, self).__init__('some soll hier A sein')
class B(Common):
def __init__(self):
super(B, self).__init__('hier soll es B sein')
Ok, ist schon klar, das ist synthetischer Code, tut aber nichts zu Sache. Nach allem, was ich so weiß, funktioniert das theoretisch. In der Praxis funktioniert das auch, beispielsweise auf einem 2.7.x-Python auf Linux.
Bis ich das in einem virtualenv auf meinem Mac laufen lasse (Python 2.7.2). Dann werde ich mit folgender Meldung beglückt:
TypeError: super(type, obj): obj must be an instance or subtype of type
Nicht, was ich erwartet hatte. Google spuckt dazu einen netten Link namens Another super() wrinkle – raising TypeError aus, und wer Freude dran hat, darf sich ruhig in den Artikel vertiefen. Allein: Ich benutze keinen Plugin-Loader, der Fehler tritt bei mir beim ganz normalen Unittest auf (mit einem ganz normalen unittest2, muss ich wohl dazu sagen). Ich überspringe hier mal lange Debugging-Sessions und komme gleich zum Kern: super(self.__class__, self).__init__(...) tut's:
class Common(object):
def __init__(self, some):
self._some = some
class A(Common):
def __init__(self):
super(self.__class__, self).__init__('some soll hier A sein')
class B(Common):
def __init__(self):
super(self.__class__, self).__init__('hier soll es B sein')
Das sieht mir zwar irgendwie wirklich zu schräg aus, und ich kann mir gut vorstellen, dass hier super irgendwie falsch behandelt wird, aber auch, dass man hier noch basteln kann, damit es hübscher aussieht. Andererseits reicht es mir wirklich vollkommen, die Vererbung im Kopf der Klassendefinition anzugeben, also ist diese Schreibweise vielleicht sogar wert, ins Muskelgedächtnis der Finger aufgenommen zu werden.
Ausserdem funktioniert's.
Keine Kommentare:
Kommentar veröffentlichen