Если ваши подписи отличаются только числом аргументов, используя аргументы по умолчанию является правильный способ сделать это. Если вы хотите иметь возможность передавать разные аргументы , я попытался бы избежать подхода, основанного на isinstance
, упомянутого в другом ответе, вместо этого используя аргументы ключевого слова. Если использование только аргументов ключевого слова становится громоздким, вы можете комбинировать его с classmethods (код bzrlib любит этот подход). Это просто глупый пример, но я надеюсь, что вы получите идею:
class C(object):
def __init__(self, fd):
# Assume fd is a file-like object.
self.fd = fd
@classmethod
def fromfilename(cls, name):
return cls(open(name, 'rb'))
# Now you can do:
c = C(fd)
# or:
c = C.fromfilename('a filename')
УВЕДОМЛЕНИЕ все эти методы класса еще пройти через то же __init__
, но используя методы класса могут быть гораздо более удобно, чем вспомнить, какие комбинации ключевых аргументов до __init__
произведение.
isinstance
лучше избегать, так как утка, набрав питона делает его трудно понять, какой объект был фактически принят в Например:., Если вы хотите взять либо имя файла или файла, как объект, который вы не можете использовать isinstance(arg, file)
потому что это много файлов-подобных объектов, которые не являются подклассами file
(например, те, которые возвращаются из urllib или StringIO, или ...). Как правило, лучше всего просто указать, что вызывающий абонент явно указал вам, какой именно объект имел в виду, используя разные аргументы ключевых слов.
заставляют меня думать, этот вопрос - http://stackoverflow.com/questions/682504/what-is-a-clean-pythonic-way-to-have-multiple -constructors-in-python – Gant
Лучшее: [Как перегрузить метод '__init__' на основе типа аргумента?] (https://stackoverflow.com/questions/141545/how-to-overload-init-method-based-on- аргумент-тип) –