Je crée une classe qui émule des types numériques afin de pouvoir utiliser des opérateurs arithmétiques de base, tels que +
, -
, etc. sur les instances de cette classe. Cependant, je veux être capable de gérer l'opération de différentes manières en fonction des types d'opérandes. Par exemple, si je crée une classe foo_c
avec __add__()
en fonction, je veux être en mesure de traiter les cas d'addition où l'un des opérandes est de type foo_c
et l'autre est de type int
ou float
ou numpy.ndarray
(ou foo_c
).Python - Type de vérification des instances d'objets
La solution que je veux mettre en œuvre est d'avoir une collection de fonctions 'additionneur' pour basculer entre basé sur le type d'opérande. Les différentes fonctions sont affectées à un dictionnaire, en tant que tel:
class foo_c:
...
self.addOps = { int: self.addScalar,
float: self.addScalar,
foo_c: self.addFoo }
...
self.addScalar(self, sclr):
...
self.addFoo(self, foo):
...
self.__add__(self, operand):
return self.addOps[type(operand)](operand)
Le problème que je vais avoir est que je ne peux pas obtenir la fonction type()
pour renvoyer la valeur appropriée à utiliser comme clé pour la dictionnaire. Après avoir créé une instance de la classe en tant que foo = foo_c()
, la fonction intégrée type(foo)
renvoie instance
au lieu de foo_c
. Je suppose que c'est parce que je ne crée pas l'objet en question; Je crée plutôt une instance de l'objet. Je l'ai utilisé foo.__class__
aussi bien, mais je reçois __main__.foo_c
que la classe retournée, ce qui ne va pas non plus ...
Je ne veux pas avoir à utiliser des lignes de isinstance()
chèques, donc est-il un moyen de obtenir type()
pour renvoyer la classe comme souhaité?
Alors, je lui ai donné un essai, et le problème que je reçois est maintenant que le 'type (foo) '' est toujours fournir en sortie __main __ foo_c' comme son type, qui. son type devrait être 'foo_c' sans' __main __. ' –
@ S.Gamgee: Non, c'est correct. '__main __. foo_c' est la bonne classe - c'est la classe' foo_c' définie dans le module '__main__'. – user2357112
Ok, je l'ai eu. Je fonctionnais dans la console IPython et j'exécutais 'type (foo) == foo_c()' au lieu de 'type (foo) == foo_c'. Je suis bon à faire. –