2013-01-26 2 views
0

Допустим, у меня есть два разных классов с различным числом аргументов:инстанцировании различные классы питона динамически

class A(object): 
    def __init__(self, arg1, arg2, arg3) 
    ... 

class B (object): 
    def __init__(self, arg1, arg2) 
    .... 

Есть ли способ для динамического создания экземпляра этих классов, учитывая, что есть разница в количестве аргументов?

Здесь я расскажу вам большую картинку. Я создал парсер XML, который успешно проанализировал всю информацию из XML-документа и закрепил их в список, основанный на именах тегов (<room> пойдет в self.room, <item> войдет в self.item и т. Д.)

Я не знаю, действительно ли это способ сделать что-то, но то, что я пытаюсь сделать, - это взять всю информацию из каждого отдельного элемента XML в их уважаемом списке, создать объекты Python из этой информации, а затем сохранить их в диктовку.

# From XMLParser class 
def objectify(self, iterator): 
    dict = {} 
    # I used elementtree to parse XML documents, 2nd argument of getattr 
    # ends up being a capitalized string of iterator's tag name. 
    # Ex, <room> becomes 'Room' 
    Object = getattr(sys.modules[__name__], iterator.tag.capitalize()) 
    for element in iterator: 
     dict[element.attrib['id']] = Object(...) 

Как я могу ввести различное количество аргументов при динамическом создании экземпляров различных классов, перечисленных выше?

Я где-нибудь рядом с правильным дорожкой, или нет?

+0

Используйте 'apply' (он принимает кортеж аргументов и словарь аргументов ключевых слов и вызывает функцию) –

ответ

2

Это должно быть легко:

klass = A 
args = (a, b, c) 
obj = klass(*args) 

Вы можете поместить все это в функции фабрики или класса.

+0

Не работает ли' A (* args) '? –

+0

Это было бы, но если вы знаете, что вы вызываете 'A', вам не нужно передавать кортеж (в теории) неизвестного размера в качестве аргумента. – chepner

+0

@WaleedKhan: ОП спрашивает динамическое создание экземпляра, поэтому я предполагаю, что он не знает класс априори. Это типичный вариант использования для заводского шаблона. – Ber

1

Я думаю, *args ваш друг здесь. Он представляет список аргументов, поэтому может справиться с созданием обоих классов.

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