2016-09-08 8 views
0

このクラスのインスタンスで+,-などのような基本的な算術演算子を使用できるように数値型をエミュレートするクラスを作成しています。しかし、私はオペランドがどのような型であるかによって異なる方法で操作を処理できるようにしたい。私は関数として__add__()でクラスfoo_cを作成していた場合たとえば、その後、私は1つのオペランドがタイプfoo_cであり、他のタイプintまたはfloatまたはnumpy.ndarray(またはfoo_c)である追加のケースを扱うことができるようにしたいです。Python型オブジェクトのインスタンスのチェック

私が実装したいソリューションは、オペランドタイプに基づいて切り替えるための「加算」関数のコレクションを持つことです。異なる機能は、次のような、辞書に割り当てられている:

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) 

私がいる問題は、私はのためのキーとして使用されるべき適切な値を返すようにtype()機能を得ることができないということです辞書。クラスのインスタンスをfoo = foo_c()として作成した後、組み込み関数type(foo)foo_cの代わりにinstanceを返します。これは、問題のオブジェクトを作成していないためです。むしろオブジェクトのインスタンスを作成しています。私は道にはあり、私はisinstance()チェックのラインを使用する必要がしたくないだけでなくfoo.__class__を使用しましたが、右のいずれかではありません返されるクラス、など__main__.foo_c ...

を取得していますtype()で希望のクラスに戻すことができますか?

答えて

1

あなたはobjectからfoo_c継承を持っているのを忘れて、あなたは古いスタイルのクラスを取得しています。それはobjectから継承してください:

class foo_c(object): 
    ... 
+0

だから、私はそれを試して与えた、と私は今取得しています問題は、 'タイプ(fooは)'まだ__main '出力しているということである__ foo_c'そのタイプとして、これ。そのタイプは '__main __なし' foo_c'でなければなりません。 –

+1

@ S.Gamgee:いいえ、そうです。 '__main __。foo_c'は正しいクラスです - これは' __main__'モジュールで定義された 'foo_c'クラスです。 – user2357112

+0

さて、私はつかまえました。私はIPythonコンソールで操作していて、 'type(foo)== foo_c'の代わりに' type(foo)== foo_c() 'を実行していました。私は行きたい。 –

関連する問題