Lorsque j'essaie de monkey-patch une classe avec une méthode d'une autre classe, cela ne fonctionne pas parce que l'argument self
n'est pas du bon type.
Par exemple, le résultat de la méthode __str__
créée par la classe fantaisie A
:
class A:
def __init__(self, val):
self.val=val
def __str__(self):
return "Fancy formatted %s"%self.val
et souhaite le réutiliser pour un cours ennuyeux B
:
class B:
def __init__(self, val):
self.val=val
En d'autres termes :
>>> b=B("B")
>>> #first try:
>>> B.__str__=A.__str__
>>> str(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method __str__() must be called with A instance as first argument (got nothing instead)
>>> #second try:
>>> B.__str__= lambda self: A.__str__(self)
>>> str(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: unbound method __str__() must be called with A instance as first argument (got B instance instead)
Dans les deux cas, cela ne fonctionne pas parce que l'argument self
doit être une instance de la classe A
mais ce n'est manifestement pas le cas.
Ce serait bien de trouver un moyen de faire le monkey-Parcheando, mais ma question actuelle est de savoir pourquoi il est nécessaire d'avoir le paramètre implicite self
pour être une instance de la "bonne" classe et ne pas dépendre uniquement du typage du canard ?