Как я могу сделать генерацию динамического класса в Python? (или будет серия if / elses будет лучше) - PullRequest
2 голосов
/ 09 августа 2010

Итак, я пишу что-то, и я наткнулся на контрольно-пропускной пункт о том, как это сделать (и как правильно делать вещи).ТАК, объяснение ситуации поможет лучше понять проблему, и, надеюсь, кто-то узнает ответ :) Вот так:

По сути, я пишу некоторые динамические формы на Python (точнее, Django) -Я использую фабрику форм для создания формы, которую я хочу сделать.Это все прекрасно, но я до сих пор определял свойства формы жестко закодированным способом, в основном сопоставляя свойство определенной форме (ChoiceField, Boolean и т. Д.).НО, что я хотел бы вместо жесткого кодирования этих значений, по сути, динамически создавать словарь свойств, основываясь на том, какую информацию я передаю ...

У меня в основном есть массив "опций", и вотДва метода, которые я рассматриваю:

  1. Есть функция для моей модели / объекта "options", которая будет иметь серию 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...
Используйте очень полиморфный подход.Таким образом, я имею в виду создание объекта на основе моего объекта «option» и буду создавать новый объект на основе параметра.Скажите, может быть, что-то вроде:
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())

Если вариант второй - это путь, может кто-нибудь объяснить, как я могу создать объект динамически на основе переменной?Например, сопоставление имени значения (скажем, Артефакта с соответствием Artifact_Property).

Большое спасибо за помощь!Мне действительно интересно посмотреть, что будет правильным образом - возможно, это вызовет дискуссию:)

-Shawn

1 Ответ

5 голосов
/ 09 августа 2010

Рассматривали ли вы использование словаря?Они отлично подходят для такого рода условных.

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

return options[field_type](label='blah')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...