2017-03-16 3 views
1

types.new_classの方法をpython3.3で後で使用する方法はありますか?
次はシグニチャです。Pythonの名前空間オブジェクトの手段

types.new_class(name, bases=(), kwds=None, exec_body=None) 

exec_bodyの使用方法は?
exec_bodyは呼び出し可能オブジェクトでなければならず、引数はnsです。 (たぶんnamespaceを意味する)
nsに渡すタイプのオブジェクトは?
new_classの文書によると 、

exec_body引数は、新規に作成したクラスの名前空間を埋めるために使用されるコールバックです。クラスの名前空間を唯一の引数として受け入れ、クラスの内容で直接名前空間を更新する必要があります。コールバックが提供されない場合、ラムダns:nsで渡すのと同じ効果があります。

nsとexec_bodyに関する上記の説明の意味はありません。
この機能はどのように使用できますか?

+0

おそらくラムダを使用して開始します。または、それを「なし」のままにします – abccd

答えて

2

名前空間は辞書です。新しいクラスオブジェクトに必要な属性(メソッドを含む)を入力します。ここには簡単なデモがあります。もちろん

import types 

def body(ns): 
    def __init__(self, a): 
     self.a = a 

    d = { 
     '__doc__': 'A test class', 
     'some_cls_attr': 42, 
     '__repr__': lambda self: 'Test(a={})'.format(self.a), 
     '__init__': __init__, 
    } 
    ns.update(d) 

Test = types.new_class('Test', bases=(), kwds=None, exec_body=body) 

print(Test.some_cls_attr) 
print(Test('hello')) 
#help(Test) 

出力

42 
Test(a=hello) 

、この単純な例のためには、通常のクラス作成の構文を使用してはるかに賢明です。