2016-10-19 9 views
0

はシナリオです:動的なクラスの作成 - ここではPython

class A: 
    pass: 

class B: 
    pass 

今私は、クライアントを作成することで、私は小さなユーティリティメソッドを持っている必要があり、はず:

私は2つのクラスを持っています私のクラスのテンプレート/オブジェクトを返します。例:クラスA、クラスB、そのクラスの名前を渡します。例えばget_obj(classA)です。

これは可能ですか?もし私が今、ウェブの中で正しい答えを得られないので、アプローチを提案してください。

希望しています。

+0

クラスを[オブジェクト]にする(https://jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/) –

+1

はい、あなたは'cls = {'classA':A、 'classB':B}'のような 'dict'を持つだけで、' get_obj'の実装に 'cls.get( 'classA')'を呼び出すことができます。これはスタートですが、実際に何をしたいのかについての詳細はほとんどなく、実際の答えは全く異なる場合があります。 – metatoaster

+1

なぜそれが必要ですか?このメソッドが返す、空のクラスとは何ですか? – Messa

答えて

2

が可能な実装です。すべてのコードは、それが次の出力

<__main__.A instance at 0x1026ea950> 
0

標準ライブラリ関数namedtupleは、クラスを作成して返します。内部的にはexecを使用します。あなたが必要とするものにインスピレーションを与えるかもしれません。

ソースコード:ここでhttps://github.com/python/cpython/blob/master/Lib/collections/init.py#L356

+0

言語そのもののデザイナーは、この種のものに 'exec 'を使ってみても一見問題がないと考えているので、人々がこの答えを下降させているのは面白いです。 –

+0

@RickTeachey私は質問を**定義する**クラスについてではないので、私はそれをdownvotedしました。 _smallユーティリティメソッドを定義することです。これはクラステンプレート/オブジェクト(クラスA、クラスB)を返します。クラス名はそのユーティリティに渡します。 –

+0

元の質問者から実際に何をすべきかをもっと明確にする必要があると思います。彼は@ AnthonyKongの答えやよりダイナミックなもののようなちょっとした辞書の検索をしたいのかどうか。 – Messa

0

globals()は(含むモジュールのグローバルスコープで定義されたすべてのシンボルを含む辞書を返し生成する単一「の.py」ファイル

class A:                        
    pass                        


class B:                        
    pass                        

# map class name to class                          
_classes = {                       
     A.__name__: A,                    
     B.__name__: B,                    
}                         

def get_obj(cname):                      
    return _classes[cname]()                    

# test the function                          
if __name__ == '__main__':                   
    print get_obj('A') 

に含まれていますクラスAB):

012 a_and_b_module.py

あなたはシンプル

を探しているなら、この関数を呼び出します、コードがモジュール内にある場合

、あなたは完全に機能を排除することができますし、直接globals()[cls_name]を使用しています。

この関数を呼び出しますコードはモジュールの外にある場合は、getattr機能を使用できます。

a_and_b_module.pyを

class A: pass 
class B: pass 

another_file.py

import a_and_b_module 

cls_name = 'A' 
chosen_cls = getattr(a_and_b_module, cls_name) 

あなたが探している完全な制御のために上記の方法で

問題は、それがABに自分自身を制限しない、a_and_b_module.pyで定義されたものを返す可能性があることです。あなたが確認する場合のみ、AとBを返すことができます。

class A: pass 
class B: pass 

allowed_classes = ('A', 'B') 

def get_cls(cls_name): 
    assert cls_name in allowed_classes 
    return globals()[cls_name] 

注:あなたも​​の概念に興味があるかもしれません。

関連する問題