2012-02-10 5 views
8

クラスを入力として受け入れるORMを使用しており、動的に生成されたいくつかのクラスにフィードを提供する必要があります。現在、私はこの不自然な例のようなものをやっている:実行時にPythonクラスを作成する最も悪い方法は何ですか?

def make_cls(_param): 
    def Cls(object): 
     param = _param 
    return Cls 

A, B = map(make_cls, ['A', 'B']) 

print A().foo 
print B().foo 

これが正常に動作している間に、それは少しではオフに感じている:例えば、両方のクラスは、REPL上<class '__main__.Cls'>として印刷します。名前の問題は大きな問題ではありませんが(私は__name__に設定して回避することができます)、私が気づいていないことが他にもあるのだろうかと思います。 私の質問は:これは、クラスを動的に作成するための良い方法ですか?

+0

可能な複製http://stackoverflow.com/questions/4513192/python-dynamic-class-names – Cez

+3

以下のローマンノートでは、クラスを動的に作成するために 'type'を使いたいと思うでしょう。 [この質問](http://stackoverflow.com/questions/100003/what-is-a-metmetlass-in-python)の先頭の答えは非常に詳細でこれをカバーしています。 – aganders3

+0

「ORM」?どのORM?オッズはORMがあなたのために大部分を占めています。 –

答えて

10

クラスとは何ですか?それはちょうどtypeのインスタンスです。 docから

>>> A = type('A', (object,), {'s': 'i am a member', 'double_s': lambda self: self.s * 2}) 
>>> a = A() 
>>> a 
<__main__.A object at 0x01229F50> 
>>> a.s 
'i am a member' 
>>> a.double_s() 
'i am a memberi am a member' 

タイプ(名前、塩基、辞書)

戻り、新しいタイプのオブジェクトたとえば。これは本質的にはclass文の動的形式です。

+0

タイプはこれらの3つのパラメータしか受け取っていないので、名前が実際に間違っていたか唯一のものであったと思いますか? 'type'の使用には他にも利点がありますか? – hugomg

+1

これをパッケージ化する良い方法は、キーワード引数をとる関数にラップすることです。関数呼び出しで新しいクラスの属性を簡単に指定することができます。 – kindall

+0

@missingnoでは、複雑なクラスをいくつか作成すると便利です(例えば 'classmethod'を' type'で追加するのは醜いでしょう)。しかし、実行時に複雑なものを作る必要があるのなら、あなたのアーキテクチャに悪いことが起きました:) 'type'はそのようなもののためのちょうど良い解決策です。 –

関連する問題