3
私は2つのクラスAとBを持っている場合、クラスAのインスタンスをクラスBに「ジャンプ」させる方法がありますか?オブジェクトクラスと関連する関数を変更する方法
私は、呼び出されるとクラスAのインスタンスを本質的にクラスBオブジェクトとして再初期化し、クラスBの通常のインスタンスとしてその実行を継続するクラスAの関数を記述したいと考えています。私はクラスBのために同様の機能を作りたいと思います。これは可能ですか?
私は2つのクラスAとBを持っている場合、クラスAのインスタンスをクラスBに「ジャンプ」させる方法がありますか?オブジェクトクラスと関連する関数を変更する方法
私は、呼び出されるとクラスAのインスタンスを本質的にクラスBオブジェクトとして再初期化し、クラスBの通常のインスタンスとしてその実行を継続するクラスAの関数を記述したいと考えています。私はクラスBのために同様の機能を作りたいと思います。これは可能ですか?
驚いたことに、はい。
>>> class C: pass
...
>>> c = C()
>>> type(c)
<class '__main__.C'>
>>> c.__class__
<class '__main__.C'>
>>>
>>>
>>> class D: pass
...
>>> c.__class__ = D
>>> c.__class__
<class '__main__.D'>
>>> type(c)
<class '__main__.D'>
私はこれを行うためにPython 3.6.3を使用しました。
実際にジャンプして見たいですか?これをチェックしてください:
>>> class C:
... def speak(self):
... return "I'm a C"
...
>>> class D:
... def shout(self):
... return "I'M A D"
...
>>> c = C()
>>> c.speak()
"I'm a C"
>>> c.__class__ = D
>>> c.shout()
"I'M A D"
私はあなたを愛しています。私はそう思います....これは変です。しかし、クール、ええ?
元のクラスの属性をどのように保持できるかを確認するには、自分でテストを試してみましょう。それはきちんとしている。
コードの臭いのようです。クラスを投稿し、達成しようとしていることを説明できますか? –
私はそれが好きではありませんが、私は別の方法を考えることはできません。私はまだファイルを作成していませんが、私はフラグゲームを自律的にキャプチャしています。各チームには防御的で攻撃的な2人のエージェントがいて、死ぬとその役割を変えたいと思っています。これは解決策のようだった –
それはにおいです。ロールはオブジェクトの_property_で、実行時に割り当てられる必要があります。異なるロールに対する許可された振る舞いは、オブジェクト合成、または独自のロール・テーブルを使用して管理できます。これは本当に 'クラス' IMHOのための良い使用ではありません。しかし、他の人は反対するかもしれない。 –