Je suis occupé à créer une métaclasse qui remplace une fonction de remplacement sur une classe par une nouvelle avec une implémentation correcte. La fonction d'origine pourrait utiliser n'importe quelle signature. Mon problème est que je n'arrive pas à comprendre comment créer une nouvelle fonction avec la même signature que l'ancienne. Comment ferais-je cela?Comment créer dynamiquement une fonction avec la même signature qu'une autre fonction?
Mise à jour
Cela n'a rien à voir avec la question réelle qui est « Comment puis-je créer dynamiquement une fonction avec la même signature que une autre fonction? » mais j'ajoute ceci pour montrer pourquoi je ne peux pas utiliser de sous-classes. J'essaye d'implémenter quelque chose comme Scala Case Classes en Python. (Pas l'aspect pattern matching seulement les propriétés générées automatiquement, eq, méthodes de hachage et str.)
Je veux quelque chose comme ceci: Pour autant que je peux voir
>>> class MyCaseClass():
... __metaclass__ = CaseMetaClass
... def __init__(self, a, b):
... pass
>>> instance = MyCaseClass(1, 'x')
>>> instance.a
1
>>> instance.b
'x'
>>> str(instance)
MyCaseClass(1, 'x')
, il n'y a aucun moyen que avec des sous-classes.
« remplace une fonction de talon sur une classe avec une nouvelle avec une bonne mise en œuvre » est-ce pas seulement une sous-classe? –
Non. Les classes marquées avec la métaclasse auront des méthodes spécifiques remplacées par de nouvelles avec des implémentations appropriées. Les classes seront définies par les utilisateurs de la bibliothèque. Les implémentations doivent être générées dynamiquement en fonction des signatures de méthode. Comment ferais-je cela avec des sous-classes? – hwiechers
"Les [sous-classes] seront définies par les utilisateurs de la bibliothèque". C'est comme ça que l'héritage fonctionne. "Les implémentations [correspondent] aux signatures de méthode" car c'est ainsi que fonctionne l'héritage. Je ne vois pas pourquoi l'héritage simple n'est pas approprié. Peut-être que si vous fournissiez du code qui prouvait que l'héritage simple ne pouvait pas être utilisé. –