Вы можете создать класс-оболочку и перегрузить его метод __new__()
, чтобы он возвращал экземпляры специализированных подклассов, например ::10000
class Registrar(object):
def __new__(self, domain):
if ...:
return RegistrarA(domain)
elif ...:
return RegistrarB(domain)
else:
raise Exception()
Кроме того, чтобы справиться с не взаимоисключающими условиями, проблемой, которая поднималась в других ответах, первый вопрос, который нужно задать себе, - хотите ли вы, чтобы класс-обертка, который играет роль диспетчера, управлял условия, или он будет делегировать его специализированным классам. Я могу предложить общий механизм, в котором специализированные классы определяют свои собственные условия, но оболочка выполняет проверку, как это (при условии, что каждый специализированный класс предоставляет метод класса, который проверяет, является ли он регистратором для определенного домена, is_registrar_for (. ..) как предложено в других ответах):
class Registrar(object):
registrars = [RegistrarA, RegistrarB]
def __new__(self, domain):
matched_registrars = [r for r in self.registrars if r.is_registrar_for(domain)]
if len(matched_registrars) > 1:
raise Exception('More than one registrar matched!')
elif len(matched_registrars) < 1:
raise Exception('No registrar was matched!')
else:
return matched_registrars[0](domain)