2008-09-15 14 views
1

Ich möchte eine untergeordnete Klasse erstellen, die über eine Methode der übergeordneten Klasse verfügt, wobei die Methode eine 'Klassenmethode' in der untergeordneten Klasse aber nicht in der übergeordneten Klasse ist.Erstellen einer übergeordneten Klassenmethode

Im Grunde versuche ich folgendes zu erreichen:

class foo(Object): 
    def meth1(self, val): 
     self.value = val 

class bar(foo): 
    meth1 = classmethod(foo.meth1) 

Antwort

3

Ich bin mir auch nicht ganz sicher, was genau das gewünschte Verhalten ist, aber unter der Annahme, dass bar.meth1 (42) äquivalent zu foo.meth1 als Klassenmethode von bar sein soll (wobei "self" das ist) Klasse), dann können Sie dies mit acheive:

def convert_to_classmethod(method): 
    return classmethod(method.im_func) 

class bar(foo): 
    meth1 = convert_to_classmethod(foo.meth1) 

Das Problem mit Class (foo.meth1) ist, dass foo.meth1 bereits ein Verfahren, mit besonderer Bedeutung für den ersten Parameter umgewandelt wurde. Sie müssen dies rückgängig machen und auf das zugrunde liegende Funktionsobjekt schauen, wobei Sie neu interpretieren, was "Selbst" bedeutet.

Ich würde auch warnen, dass dies eine ziemlich seltsame Sache zu tun ist, und damit zu Verwirrung für jeden Leser Ihres Codes verursachen kann. Sie sind wahrscheinlich besser dran, durch eine andere Lösung für Ihr Problem zu denken.

3

Was Sie versuchen zu erreichen? Wenn ich ein solches Konstrukt im Live-Python-Code sah, würde ich überlegen, den ursprünglichen Programmierer zu schlagen.

0

Die Frage, wie gestellt, scheint mir ziemlich merkwürdig: Ich kann nicht sehen, warum irgendjemand das machen möchte. Es ist möglich, dass Sie gerade falsch verstehen, was eine "Klassenmethode" in Python ist (sie unterscheidet sich etwas von einer statischen Methode in Java).

Eine normale Methode ist mehr oder weniger nur eine Funktion, die als erstes Argument (normalerweise "self" genannt) eine Instanz der Klasse verwendet und die als "." Aufgerufen wird.

Eine Klassenmethode ist mehr oder weniger nur eine Funktion, die als ihr erstes Argument (oft als "cls" bezeichnet) eine Klasse verwendet und die als "." Aufgerufen werden kann. ODER als ".".

In diesem Sinne und Ihrem oben gezeigten Code, was würden Sie erwarten, wenn jemand eine Instanz von bar erstellt und meth1 aufruft?

bar1 = bar() 
bar1.meth1("xyz") 

Wenn der Code zu meth1 aufgerufen wird, wird es zwei Argumente ‚Selbst‘ geführt und ‚val‘. Ich nehme an, dass Sie erwarten, dass "xyz" für "val" weitergegeben wird, aber was denken Sie wird für "selbst" weitergegeben? Sollte es die bar1-Instanz sein (in diesem Fall war keine Überschreibung erforderlich)? Oder sollte es die Klassenleiste sein (was würde dann dieser Code tun)?

Verwandte Themen