2010-10-12 164 views
19

我需要動態創建一個類。爲了進一步詳細說明,我需要動態創建Django的Form類的子類。動態創建類 - Python

通過動態我打算根據用戶提供的配置創建一個類。


例如,

我想叫CommentForm一個類應繼承Form類

類應該有選擇的屬性

列表....在這種情況下

name = forms.CharField()

評論= forms.CharField(小部件= forms.Textarea())


任何有用的提示? :)

+0

「我需要動態創建一個類。」這是很少需要的,你必須提供更多的信息才能使這個問題變得有意義。 – 2010-10-12 14:55:59

回答

32

您可以通過調用type內置,通過適當的參數一起,像動態創建類:

CommentForm = type("CommentForm", (Form,), { 
    'name': forms.CharField(), 
    ... 
}) 

它與新式的類。我不確定這是否也適用於舊式課程。

+1

只要它們不是唯一的基類,它就可以與舊式類一起工作。所以例如你可以做'type(name,(OldStyleClass,object),attrib_dict)'而不是'type(name,(OldStyleClass,),attrib_dict')。如果你需要生成的類是舊式的,你仍然可以通過將它放入一個函數來參數化類的創建,就像[這個答案]一樣(http://stackoverflow.com/questions/3915024/dynamically-creating-classes -python/3915110#3915110)。 – intuited 2010-10-15 11:46:52

12

類可以在幾乎任何地方定義。

def newclass(val): 
    class C(object): 
    def __str__(self): 
     return str(val) 
    return C 

MyClass = newclass(5) 
m = MyClass() 
print str(m) 
+1

對於一些讀者來說,這種技術可以用來設置'C'的基類,這可能並不明顯。如果您出於某種原因需要動態創建舊式類,這非常有用。 – intuited 2010-10-15 11:50:59

+1

如果你想設置類變量,這不起作用 – user178047 2015-10-29 23:43:37