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

1

как мне создавать экземпляры объекта во время выполнения в 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

чтобы получить "КЛАСС B" при вызове: somefunc('a').println

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

Теги:
object
dynamic
runtime

2 ответа

6
Лучший ответ

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

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

instance = dispatch[which_one]() # Notice the second pair of parens here!
  • 0
    это решило мою проблему! большое спасибо!
2

Вы создаете экземпляр класса, вызывая класс. Ваш класс 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>
  • 0
    выглядит как хорошее решение тоже. большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню