如何在Python中进行动态类生成?(或者一系列if/elses会更好)

sha*_*jan 2 python forms oop django inheritance

所以,我正在写一些东西,我遇到了如何做到这一点的障碍(以及正确的做事方式).所以,解释这种情况将有助于更好地理解问题,并希望有人会知道答案:)在这里:

基本上,我在Python中编写了一些动态表单(更具体地说是Django) - 我正在使用表单工厂来生成我想要的表单.这很好,花花公子,到目前为止,我一直在以硬编码的方式定义表单的属性,基本上将属性与某个表单(ChoiceField,布尔值等)匹配.但是,我希望而不是硬编码这些值本质上是根据我传递的信息动态创建属性字典...

我基本上有一个"选项"数组,所以这里是我正在考虑的两种方法:

  1. 为我的"选项"模型/对象提供一个函数,它将具有一系列if/elses.喜欢:
def get_property():
    if value = "artifact": #artifact being one option
        return form.BooleanField(label="blah")
    else if value = "environment": #environment being another type of option
        return form.ChoicesField(label="blah")
    etc...
Run Code Online (Sandbox Code Playgroud)
  1. 使用非常多态的方法.这样,我的意思是基于我的"选项"对象创建一个对象,并将基于该选项创建一个新对象.说可能是这样的:
class Base_Property():
    value = ""
    def __init__(self, option):
        value = form.BooleanField()

class Artifact_Property(Base_Property):
    def __init__(self, option):
        Base_Property.__init__(self, option)
        value = form.ChoiceField(choices=some_choices_array())
Run Code Online (Sandbox Code Playgroud)

如果选项二是要走的路,有人可以解释我如何根据变量动态创建对象吗?比如,匹配值的名称(例如,Artifact,以匹配Artifact_Property).

非常感谢你的帮助!我真的很有兴趣看到恰当的方式 - 也许它会激起争论:)

-Shawn

Dan*_*man 5

你考虑过用字典吗?他们非常适合这种条件.

def get_option(field_type):
    options = {
        'artifact': forms.BooleanField,
       'environment': forms.Choice Field,
    }

return options[field_type](label='blah')
Run Code Online (Sandbox Code Playgroud)