実行時にPythonでクラスを動的に作成したいと思います。実行時にクラスを作成するときに `type()`よりも `exec`を使う利点は何ですか?
例えば、私は以下のコードで複製したい:
>>> class RefObj(object):
... def __init__(self, ParentClassName):
... print "Created RefObj with ties to %s" % ParentClassName
... class Foo1(object):
... ref_obj = RefObj("Foo1")
... class Foo2(object):
... ref_obj = RefObj("Foo2")
...
Created RefObj with ties to Foo1
Created RefObj with ties to Foo2
>>>
を...しかし、私は、動的に作成されるFOO1、foo2は、Fooのクラス(すなわちたい:実行中の代わりに、最初のパス上をコンパイル)。これを達成するための
一つの方法はそうのように、type()
である:
>>> class RefObj(object):
... def __init__(self, ParentClassName):
... print "Created RefObj with ties to %s" % ParentClassName
... def make_foo_class(index):
... name = "Foo%s" % index
... return type(name, (object,), dict(ref_obj = RefObj(name)))
...
>>> Foo1 = make_foo_class(1)
Created RefObj with ties to Foo1
>>> Foo2 = make_foo_class(2)
Created RefObj with ties to Foo2
>>> type(Foo1()), type(Foo2())
(<class 'Foo1'>, <class 'Foo2'>)
私もそうのように、exec
とそれを達成することができます:
>>> class RefObj(object):
... def __init__(self, ParentClassName):
... print "Created RefObj with ties to %s" % ParentClassName
... def make_foo_object(index):
... class_template = """class Foo%(index)d(object):
... ref_obj = RefObj("Foo%(index)d")
... """ % dict(index = index)
... global RefObj
... namespace = dict(RefObj = RefObj)
... exec class_template in namespace
... return namespace["Foo%d" % index]
...
>>> Foo1 = make_foo_object(1)
Created RefObj with ties to Foo1
>>> Foo2 = make_foo_object(2)
Created RefObj with ties to Foo2
>>> type(Foo1()), type(Foo2())
(<class 'Foo1'>, <class 'Foo2'>)
exec
の使用は十分に座っていません。私と一緒に(この質問を読んだ多くの人には期待していませんが)exec
はです。ちょうどどのようにpythonのcollections.namedtuple()
クラスis implemented(this line参照)。また、クラス(Raymond Hettinger)の作成者がexec
hereのこの使用を防御することも非常に重要です。この防御では、 "は、名前付きタプルの重要な機能であり、手書きのクラスと全く同じです"と述べています。type()
の使用がexec
...
違いがありますか?なぜexec
とtype()
を使用するのですか?
回答は、両方の方法が同じで、単純にnamedtuple
実装に多数のnamedtuple変数があり、すべてのメソッドのクロージャを動的に生成すると、コードが扱いにくくなるしかし、これ以上何かがあるかどうかを知りたい。
exec
の私の不快感について、信頼できない当事者が悪意あるコードをそれに注入する方法がなければ、それはうまくいくはずです...それは私が緊張していることを確実にしています。
http://blog.ccpgames.com/kristjan/2011/05/28/namedtuple-and-exec/でもこの問題に関する良い議論があり、それについての別の良いブログ記事がありました私は今見ていない。あなたの状況で 'type'が問題である理由を何も提示していないので、' type'が動作することを知っているので、 'exec'をどうして気にするのか分かりません。 (好奇心以外は明らかに)。 – agf
@agf - 素晴らしいリンク、ありがとう!両方のアプローチが動作するので、私はもともと 'type'に問題がありませんでした。私はその違いについて興味があり、 'namedtuple'で' exec'を使う理由を理解しようとしていました。しかし、私は頻繁に[decorator](http://pypi.python.org/pypi/decorator)パッケージの使用を必要とするデコレータの問題を抱えています。 – Russ
動的なクラス作成の必要性の背後にある理由を教えてもらえますか、それとも単に好奇心ですか? – dhill