создавать объекты во время выполнения в python - PullRequest
1 голос
/ 02 мая 2011

как мне создать экземпляры объектов во время выполнения в python?

скажем, у меня есть 2 класса:

class MyClassA(object):
    def __init__(self, prop):
        self.prop = prop
        self.name = "CLASS A"

    def println(self):
        print self.name


class MyClassB(object):
    def __init__(self, prop):
        self.prop = prop
        self.name = "CLASS B"

    def println(self):
        print self.name

и dict

{('a': MyClassA), ('b': MyClassB)}

как можноя создаю динамический экземпляр одного из моих двух классов, в зависимости от того, выбираю я 'a' или 'b'.

вид этого:

somefunc(str):
    if 'a': return new MyClassA
    if 'b': return new MyClassB

, чтобы получить "CLASS B" навызов: somefunc('a').println

но более элегантно и динамично (скажем, я добавляю больше классов к dict во время выполнения)

Ответы [ 2 ]

6 голосов
/ 02 мая 2011

Вы можете создать диспетчер, представляющий собой словарь, в котором ключи сопоставляются с классами.

dispatch = {
    "a": MyClassA,
    "b": MyClassB,
}

instance = dispatch[which_one]() # Notice the second pair of parens here!
2 голосов
/ 02 мая 2011

Вы создаете экземпляр класса, вызывая его. Ваш класс dict {('a': MyClassA), ('b': MyClassB)} возвращает классы; поэтому вам нужно только позвонить в класс:

classes['a']()

Но я чувствую, что вы хотите что-то более конкретное. Вот подкласс dict, который при вызове с ключом ищет связанный элемент и вызывает его:

>>> class ClassMap(dict):
...     def __call__(self, key, *args, **kwargs):
...         return self.__getitem__(key)(*args, **kwargs)
... 
>>> c = ClassMap()
>>> c['a'] = A
>>> c['b'] = B
>>> c('a')
<__main__.A object at 0x1004cc7d0>
...