2016-09-08 1 views
0

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é?

Répondre

1

Vous avez oublié d'avoir foo_c hériter de object, donc vous obtenez un cours de style ancien. Faites-hériter de object:

class foo_c(object): 
    ... 
+0

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 __. ' –

+1

@ 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

+0

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. –