Frage

Ich mag ein Kind Klasse machen, die eine Methode der Elternklasse hat, wo das Verfahren eine ‚Class‘ ist in der Kind-Klasse, aber nicht in der übergeordneten Klasse.

Im Grunde versuche ich folgendes zu erreichen:

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

class bar(foo):
    meth1 = classmethod(foo.meth1)
War es hilfreich?

Lösung

Ich bin auch nicht ganz sicher, was das genaue Verhalten, das Sie wollen, aber seine Annahme, dass Sie wollen bar.meth1 (42) als gleichwertig zu sein ein Class von Bar foo.meth1 (mit „Selbst“ ist die Klasse ), dann können Sie acheive dies mit:

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 umgewandelt worden, mit besonderer Bedeutung für den ersten Parameter. Sie müssen dies rückgängig zu machen und auf dem zugrunde liegenden Funktionsobjekt zu betrachten, neu zu interpretieren, was „Selbst“ bedeutet.

Ich würde warnen auch, dass dies ein ziemlich seltsam, was zu tun und damit verwechslungs jemand zu veranlassen, den Code zu lesen. Sie sind wahrscheinlich besser durch eine andere Lösung für Ihr Problem zu denken.

Andere Tipps

Was wollen Sie erreichen? Wenn ich ein solches Konstrukt in Live-Python-Code sah, ich hielte die ursprüngliche Programmierer zu schlagen.

Die Frage, wie gestellt, scheint mir sehr seltsam: Ich kann nicht sehen, warum jemand das tun wollen würde. Es ist möglich, dass Sie Missverständnis genau das, was ein „Class“ in Python ist (es ist ein bisschen anders als, sagen wir, eine statische Methode in Java).

ein normales Verfahren ist mehr oder weniger nur eine Funktion, die als erstes Argument nimmt (normalerweise als „selbst“), eine Instanz der Klasse, und bei dem es aufgerufen, wie „“.

A Class ist mehr oder weniger nur eine Funktion, die als erstes Argument (oft als „cls“), eine Klasse, und die als aufgerufen werden können „“ OR als "".

In diesem Sinne, und Ihr Code oben gezeigt, was würden Sie zu erwarten haben passieren, wenn jemand eine Instanz bar erzeugt und ruft meth1 auf sie?

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

Wenn der Code zu meth1 aufgerufen wird, wird es zwei Argumente ‚Selbst‘ geführt und ‚val‘. Ich denke, dass Sie „xyz“ bestanden werden für ‚val‘ erwarten, aber was denken Sie wird für ‚Selbst‘ übergeben? Sollte es die bar1 Instanz sein (in diesem Fall wurde keine Überschreibung erforderlich)? Oder sollte es die Klasse bar (was dann würde dieser Code DO)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top