Вопрос будет более Почему вы это делаете в первую очередь? Какое преимущество вы думаю используя струны есть?
объекты класса hashable, так что вы можете использовать Minority.mixin
и Majority.mixin
непосредственно в качестве ключей. И когда вы это сделаете, вы гарантируете, что ключ всегда тот же самый объект, если ваши классы являются глобальными в своих соответствующих модулях, что делает их одноклассниками вашей программы. Более того, нет никаких шансов на случайную путаницу, когда вы позже реорганизуете свой код для переименования модулей, и вы получите разные типы с таким точным результатом repr()
.
Так что, если у вас нет конкретной утилиты, в которой вы не можете не использовать, вы не должны использовать представления строк.
(И даже если вы должны были генерировать классы с заводской функцией, использование базового класса и isinstance
, вероятно, будет предпочтительным проверять или извлекать базовый класс из MRO).
Так, для USECASE, придерживайтесь:
lookup = {
Minority.mixin: report_minority,
Majority.mixin: report_majority,
}
def report(o):
h = lookup[type(o)])
h()
Далее, если вы убедитесь, что report_minority
и report_majority
являются функции (а не методы, например), вы можете использовать functools.singledispatch()
и обойтись без вашего отображение в целом:
from functools import singledispatch
@singledispatch
def report(o):
raise ValueError('Unhandled type {}'.format(type(o)))
@report.register(Minority.mixin)
def report_minority(o):
# handle a Minority instance
@report.register(Majority.mixin)
def report_majority(o):
# handle a Majority instance
Обратите внимание, что это не будет работать с методами, как и методы должны принять несколько аргументов для отправки на работу, так как они всегда принимают self
.
Одиночные диспетчерские ручки подклассы гораздо лучше, в отличие от вашего str
- на основе картографирования или даже прямого сопоставления классов.
Неважно, как долго я пишу в Python, я все еще узнаю что-то из каждого вашего ответа Martijn. –
Мне так повезло, что Мартинн ответил на мой вопрос. На самом деле, как его (или, может быть, она, мы никогда не встречались) стиль ручной работы, помогает много! –
@ Martijn Pieters ♦ Не могли бы вы немного объяснить слово «одиночные игры» во втором абзаце? Это относится к одноэлементному шаблону? Мне кажется, что в моем примере не существует такой модели, не так ли? Благодарю. –