Domanda

Vorrei creare una classe figlia che abbia un metodo della classe genitore in cui il metodo è un "metodo di classe" nella classe figlia ma non nella classe madre.

Essenzialmente, sto cercando di realizzare quanto segue:

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

class bar(foo):
    meth1 = classmethod(foo.meth1)
È stato utile?

Soluzione

Inoltre, non sono del tutto sicuro di quale sia l'esatto comportamento che desideri, ma presupponendo che tu voglia che bar.meth1(42) sia equivalente a foo.meth1 essendo un metodo di classe di bar (con "self" come classe), quindi puoi ottenere questo risultato con:

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

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

Il problema con classmethod(foo.meth1) è che foo.meth1 è già stato convertito in un metodo, con un significato speciale per il primo parametro.È necessario annullare questa operazione e osservare l'oggetto funzione sottostante, reinterpretando il significato di "sé".

Vorrei anche avvertire che questa è una cosa piuttosto strana da fare e quindi suscettibile di causare confusione a chiunque legga il tuo codice.Probabilmente faresti meglio a pensare a una soluzione diversa al tuo problema.

Altri suggerimenti

Cosa stai cercando di realizzare?Se vedessi un simile costrutto nel codice Python live, prenderei in considerazione l'idea di battere il programmatore originale.

La domanda, così come posta, mi sembra piuttosto strana:Non vedo perché qualcuno dovrebbe volerlo fare.È possibile che tu non abbia capito bene cosa sia un "metodo di classe" in Python (è un po' diverso, ad esempio, da un metodo statico in Java).

Un metodo normale è più o meno solo una funzione che prende come primo argomento (solitamente chiamato "self"), un'istanza della classe, e che viene invocata come ".".

Un metallo di classe è più o meno solo una funzione che prende come il suo primo argomento (spesso chiamato "CLS"), una classe e che può essere invocata come "". O come ".".

Tenendo presente questo e il codice mostrato sopra, cosa ti aspetteresti che accada se qualcuno crea un'istanza di bar e chiama meth1 su di essa?

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

Quando viene chiamato il codice di meth1, vengono passati due argomenti "self" e "val".Immagino che ti aspetti che "xyz" venga passato per "val", ma cosa pensi che venga passato per "self"?Dovrebbe essere l'istanza bar1 (in questo caso non era necessaria alcuna sostituzione)?O dovrebbe essere la barra della classe (cosa farebbe allora questo codice)?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top