#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. Спасибо! Я только что перепутал порядок отображения классов и определения классов.