このクラスのインスタンスで+
,-
などのような基本的な算術演算子を使用できるように数値型をエミュレートするクラスを作成しています。しかし、私はオペランドがどのような型であるかによって異なる方法で操作を処理できるようにしたい。私は関数として__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()
で希望のクラスに戻すことができますか?
だから、私はそれを試して与えた、と私は今取得しています問題は、 'タイプ(fooは)'まだ__main '出力しているということである__ foo_c'そのタイプとして、これ。そのタイプは '__main __なし' foo_c'でなければなりません。 –
@ S.Gamgee:いいえ、そうです。 '__main __。foo_c'は正しいクラスです - これは' __main__'モジュールで定義された 'foo_c'クラスです。 – user2357112
さて、私はつかまえました。私はIPythonコンソールで操作していて、 'type(foo)== foo_c'の代わりに' type(foo)== foo_c() 'を実行していました。私は行きたい。 –