dire que j'ai construit une bibliothèque contenant une Foo
classe, avec le soutien de certaines méthodes magiques, disent __add__()
et __radd__()
:Existe-t-il des bonnes pratiques pour les méthodes magiques extensibles en python?
>>> class Foo(object):
... def __add__(self, rhs):
... print("Foo.__add__", rhs)
... def __radd__(self, lhs):
... print("Foo.__radd__", lhs)
...
>>> foo = Foo()
>>> foo + 3
Foo.__add__ 3
>>> 3 + foo
Foo.__radd__ 3
Lors du calcul 3 + foo
, python appelle d'abord type(3).__add__(3, foo)
, mais comme cela retourne NotImplemented
, il retombe à type(foo).__radd__(foo, 3)
:
>>> type(3).__add__(3, foo)
NotImplemented
Je voudrais les développeurs de pouvoir construire des bibliothèques au-dessus de ma bibliothèque, par exemple une bibliothèque contenant une classe Bar
, et je veux qu'ils aient un contrôle total. En particulier, je veux mettre en œuvre un mécanisme qui permet à l'autre bibliothèque de décider si foo + bar
devrait appeler foo.__add__(bar)
ou bar.__radd__(foo)
.
Je vois que NumPy a résolu cela en utilisant le schéma __array_priority__
. Mais cela semble causer quelques maux de tête (compte tenu du nombre de questions et de problèmes ouverts à ce sujet). Y a-t-il d'autres bonnes pratiques?
Voulez-vous que cela fonctionne également avec les classes existantes? –
Bien que votre question soit assez intéressante, elle manque de détails. Pouvez-vous décrire plus d'aspects du comportement désiré? –