Это просто общий случай обработки аргументов по-разному в зависимости от их типов.Обычно это считается плохой формой для тестирования типов, если это не является абсолютно необходимым, но Python имеет type()
и isinstance()
по причине!
Вы заметите, что конструктор dict()
может принимать существующий объект словаря,список (или другой итерируемый) наборов пар ключ / значение или аргументов ключевых слов (которые поступают в конструктор как словарь, но как аргумент, отличный от варианта 1).В Java или другом статически типизированном языке все они будут разными методами конструктора.Но в Python любой тип может быть передан в любом аргументе.Существует только один конструктор (или инициализатор).
Таким образом, тип dict
должен иметь несколько смартов в своем методе __init__()
, чтобы обрабатывать в качестве первого аргумента либо dict, либо список, а также необязательныйКлючевой аргумент.Оба должны быть необязательными.То, как это реализовано, будет выглядеть примерно так:
class dict(object):
def __init__(self, d={}, **kwd):
if isinstance(d, type(self)):
self.update(d)
else:
for i in d:
self[i[0]] = i[1]
self.update(kwd)
(Определение класса с использованием объектов его собственного типа проблематично, поэтому я уверен, что написанное мной на самом деле не будет работать, и, кроме того,dict
на самом деле реализован в C, но, надеюсь, вы поняли идею.)
В ваших собственных объектах вы можете сделать некоторые аргументы необязательными и при необходимости протестировать типы аргументов для их различной обработки в зависимостина то, что передается. Если вы хотите иметь возможность обрабатывать строки, вы можете использовать isinstance(arg, basestring)
в Python 2.x (чтобы тест соответствовал как обычным, так и Unicode-строкам) или просто isinstance(arg, str)
в Python 3.
Методы фабричного класса, предложенные Полом, тоже неплохая идея, особенно для классов, в которых инициализация может выполняться множеством способов.Я бы назвал такие методы from_str()
или около того.