Question

Je voudrais créer une classe enfant qui possède une méthode de la classe parent, la méthode étant une 'méthode de classe' dans la classe enfant mais pas dans la classe parent.

Essentiellement, j'essaie d'accomplir les tâches suivantes:

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

class bar(foo):
    meth1 = classmethod(foo.meth1)
Était-ce utile?

La solution

Je ne suis pas non plus tout à fait sûr du comportement exact que vous voulez, mais en supposant que vous voulez que bar.meth1 (42) soit équivalent à foo.meth1, qui est une méthode de classe de bar (avec "soi", classe), vous pouvez y parvenir avec:

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

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

Le problème avec classmethod (foo.meth1) est que foo.meth1 a déjà été converti en méthode avec une signification spéciale pour le premier paramètre. Vous devez annuler cela et examiner l'objet de fonction sous-jacent, en réinterprétant ce que vous utilisez. signifie.

Je tiens également à souligner que ceci est une chose assez étrange à faire, et donc susceptible de créer de la confusion pour quiconque lisant votre code. Il est probablement préférable de penser à une solution différente à votre problème.

Autres conseils

Qu'est-ce que vous essayez d'accomplir? Si je voyais une telle construction dans du code Python en direct, j’envisagerais de battre le programmeur original.

La question, telle que posée, me semble assez étrange: je ne vois pas pourquoi quelqu'un voudrait faire cela. Il est possible que vous ne compreniez pas exactement ce qu'est une "méthode de classe". est en Python (c'est un peu différent d'une méthode statique en Java, par exemple).

Une méthode normale est plus ou moins simplement une fonction qui prend comme premier argument (généralement appelé "self"), une instance de la classe et qui est appelée ".".

Une méthode de classe est plus ou moins juste une fonction qui prend comme premier argument (souvent appelée "cls"), une classe, et qui peut être invoquée comme "." OU sous la forme ".".

Dans cette optique, et avec le code ci-dessus, qu'attendriez-vous si quelqu'un crée une instance de bar et appelle meth1 dessus?

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

Lorsque le code de meth1 est appelé, deux arguments 'self' et 'val' sont passés. Je suppose que vous vous attendez à " xyz " être passé pour 'val', mais que pensez-vous être passé pour 'soi'? Devrait-il s'agir de l'instance bar1 (dans ce cas, aucune substitution n'était nécessaire)? Ou devrait-il s'agir de la barre de classe (que ferait alors ce code)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top