2017-03-22 9 views
1

渡された変数に応じてオブジェクトクラスを動的に変更する方法はありますか?たとえば:変数に依存するPythonクラス

class Parent: 
    def __init__(self, variable): 
     ... 
     some magic 
     ... 

class ChildA: 
    pass 

class ChildB: 
    pass 


cls=Parent('a') 
cls.__class__ 
<class '__main__.ChildA'> 

cls=Parent('b') 
cls.__class__ 
<class '__main__.ChildB'> 
+1

は、これらが実際に全く別々のクラスであるべきであり、彼らはするかどうかを検討し、 'Parent(何でも)'の代わりに何らかのファクトリ関数を使ってインスタンスを作成するほうが良いかもしれないかどうかを検討してください。 – user2357112

+1

シンプルなgoogle検索[これ](http://stackoverflow.com/questions/9143948/changing-the-class-type-of-a-class-after-inserted-data)が登場しました。 Googleはあなたの友人です。 –

答えて

1

これは、Parentクラスの__new__メソッドで実行できます。それは本当に作成されたものを対象についての意思決定を行うために取得します。

class Parent(object): 
    def __new__(cls, selector): 
     if selector == 'a': 
      return object.__new__(A) 
     else: 
      return object.__new__(B) 

class A(Parent): 
    letters = 'aaaaa' 

class B(Parent): 
    letters = 'bbbbb' 

a = Parent('a') 
print(a.letters) 
b = Parent('b') 
print(b.letters) 

出力は、それが動作することを証明している:

aaaaa 
bbbbb 
+0

誰かがpythonのコア開発者の回答をdownvoting誰かがこれは悪い答えだと思う_why_説明する勇気が必要です。 – msvalkon

0

__init__へのクラスの親の__new__機能で他の場合、条件のチェックを定義します。

class Parent(Object): 
    def __new__(self,s): 
     if s=='a': 
     return object.__new__(childA) 
     else: 
     return object.__new__(childB) 
class childA(Parent): 
    pass 
class childB(Parent): 
    pass 
関連する問題