2017-12-20 10 views
3

私は2つのクラスAとBを持っている場合、クラスAのインスタンスをクラスBに「ジャンプ」させる方法がありますか?オブジェクトクラスと関連する関数を変更する方法

私は、呼び出されるとクラスAのインスタンスを本質的にクラスBオブジェクトとして再初期化し、クラスBの通常のインスタンスとしてその実行を継続するクラスAの関数を記述したいと考えています。私はクラスBのために同様の機能を作りたいと思います。これは可能ですか?

+0

コードの臭いのようです。クラスを投稿し、達成しようとしていることを説明できますか? –

+0

私はそれが好きではありませんが、私は別の方法を考えることはできません。私はまだファイルを作成していませんが、私はフラグゲームを自律的にキャプチャしています。各チームには防御的で攻撃的な2人のエージェントがいて、死ぬとその役割を変えたいと思っています。これは解決策のようだった –

+0

それはにおいです。ロールはオブジェクトの_property_で、実行時に割り当てられる必要があります。異なるロールに対する許可された振る舞いは、オブジェクト合成、または独自のロール・テーブルを使用して管理できます。これは本当に 'クラス' IMHOのための良い使用ではありません。しかし、他の人は反対するかもしれない。 –

答えて

2

驚いたことに、はい。

>>> 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" 

私はあなたを愛しています。私はそう思います....これは変です。しかし、クール、ええ?

元のクラスの属性をどのように保持できるかを確認するには、自分でテストを試してみましょう。それはきちんとしている。

関連する問題