Создание экземпляра класса по ссылке

#python

#python

Вопрос:

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

Псевдокод:

 subclasses_of_foo = {"foo1": Foo1, "foo2": Foo2}
subclass_of_foo = subclasses_of_foo["foo1"]

instance = subclass_of_foo()
 

Комментарии:

1. Не то, что означает «утиный ввод», но да, это работает.

2. Вы даже можете это сделать instance = subclasses_of_foo["foo1"]() , если хотите

3. Это утиный ввод, если вы отбросите часть подкласса, верно? (до тех пор, пока я намерен вызывать метод для создаваемого объекта)

Ответ №1:

Конечно, вы можете это сделать. Попробуйте.

Комментарии:

1. Спасибо! Я только что перепутал порядок отображения классов и определения классов.

Ответ №2:

Ваш подход абсолютно правильный и работает. Классы — это просто объекты, как и все остальное в Python. Они могут храниться как значения в словаре.

ДЕМОНСТРАЦИЯ:

 >>> class Foo:
...     pass
... 
>>> class Bar:
...     pass
... 
>>> classmap = {'foo': Foo, 'bar': Bar}
>>> classmap['foo']
<class __main__.Foo at 0x107eee1f0>
>>> classmap['foo']()
<__main__.Foo instance at 0x107eefcb0>
 

Обратите внимание, что утиная типизация — это нечто совершенно другое; это практика обработки любого объекта как правильного типа при условии, что он реализует атрибуты и методы, которые вы ожидали (если он ходит как утка, это утка).

Комментарии:

1. Спасибо! Я только что перепутал порядок отображения классов и определения классов.