【问题标题】:Dynamically creating classes - Python动态创建类 - Python
【发布时间】:2011-04-24 07:43:50
【问题描述】:

我需要动态创建一个类。为了更详细地了解,我需要动态创建 Django 的 Form 类的子类。

通过“动态”,我打算根据用户提供的配置创建一个类。


例如

我想要一个名为 CommentForm 的类,它应该是 Form 类的子类。

该类应该有一个选定属性的列表。

....在这种情况下

name = forms.CharField()
comment = forms.CharField(widget=forms.Textarea())

有什么有用的提示吗? :)

【问题讨论】:

  • "我需要动态创建一个类。"这很少需要,您必须提供 很多 更多信息才能使这个问题有意义。

标签: python django class forms dynamic


【解决方案1】:

您可以通过调用type 内置函数来动态创建类,并传递适当的参数,例如:

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

它适用于新式类。我不确定这是否也适用于旧式类。

【讨论】:

  • 这将适用于旧式类,只要它们不是唯一的基类。所以例如你可以做type(name, (OldStyleClass, object), attrib_dict),但不能做type(name, (OldStyleClass,), attrib_dict)。如果您需要生成的类是旧式的,您仍然可以通过将其放入函数中来参数化类的创建,例如 this answer
【解决方案2】:

类几乎可以在任何地方定义。

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

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

【讨论】:

  • 对于某些读者来说,这种技术可用于设置C 的基类可能不是很明显。如果您出于某种原因需要动态创建旧式类,这将非常有用。
猜你喜欢
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多