2012-02-10 3 views
8

Я работаю с ORM, который принимает классы как входные данные, и мне нужно уметь подкармливать некоторые динамически сгенерированные классы. В настоящее время, я делаю что-то вроде этого надуманного примера:Каков наименее плохой способ создания классов Python во время выполнения?

def make_cls(_param): 
    def Cls(object): 
     param = _param 
    return Cls 

A, B = map(make_cls, ['A', 'B']) 

print A().foo 
print B().foo 

Хотя это прекрасно работает, он чувствует себя охлаждают немного: например, оба класса печатается как <class '__main__.Cls'> на заменах. Хотя проблема с именами не очень важна (я думаю, что смогу ее обойти, установив __name__), интересно, есть ли другие вещи, о которых я не знаю. Так что мой вопрос: есть ли лучший способ создать классы динамически или мой пример в основном прекрасен?

+0

Возможный дубликат http://stackoverflow.com/questions/4513192/python-dynamic-class-names – Cez

+3

Как Роман отмечает ниже, вы хотите использовать 'type' динамически создавать классы. Верхний ответ в [этом вопросе] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python) охватывает это очень подробно. – aganders3

+0

"ORM"? Какой ОРМ? Коэффициенты хороши, ORM делает большую часть этого для вас. –

ответ

10

Что такое класс? Это всего лишь пример type. Например:

>>> A = type('A', (object,), {'s': 'i am a member', 'double_s': lambda self: self.s * 2}) 
>>> a = A() 
>>> a 
<__main__.A object at 0x01229F50> 
>>> a.s 
'i am a member' 
>>> a.double_s() 
'i am a memberi am a member' 

От doc:

типа (название, основания, ДИКТ)

возвращает новый объект типа. Это по существу динамическая форма оператора класса.

+0

Поскольку тип получает только эти 3 параметра, могу ли я предположить, что это имя действительно было единственной ошибкой или есть и другие преимущества использования 'type' тоже? – hugomg

+1

Привлекательным способом упаковки является обернуть его в функцию, которая принимает аргументы ключевого слова, поэтому вы можете легко указать атрибуты нового класса в вызове функции. – kindall

+0

@missingno Ну, вы подойдете, если будете создавать сложные классы (например, добавление 'classmethod' с использованием' type' будет уродливым), но если вам нужно построить какой-то сложный во время выполнения, то, вероятно, что-то действительно плохо случилось с вашей архитектурой :) 'type' - просто рекомендуемое решение для таких вещей. –

Смежные вопросы