Несколько конструкторов в python? [дубликат]
Возможные Дубликаты:
Что такое чистый, подходящие для Python способ, чтобы иметь несколько конструкторов в Python?
разве нельзя определить несколько конструкторов в Python, с разными сигнатурами? Если нет, то каков общий способ обойти это?
например, допустим, вы хотите определить класс City
Я хотел бы сказать someCity = City() или someCity = City("Berlin"), где первый раз дает значение имени по умолчанию, а второе определяет его.
5 ответов:
в отличие от Java, вы не можете определить несколько конструкторов. Однако можно определить значение по умолчанию, если оно не передается.
def __init__(self, city="Berlin"): self.city = city
если ваши подписи отличаются только аргументов с использованием аргументов по умолчанию-это правильный способ сделать это. Если вы хотите иметь возможность проходить в разные видов аргумента я бы постарался избежать
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')обратите внимание, что все эти classmethods все еще проходят через то же самое
__init__, но использование classmethods может быть намного удобнее, чем запоминать, какие комбинации ключевых аргументов для__init__работа.
isinstanceлучше избегать, потому что типизация утки python затрудняет выяснение того, какой объект был фактически передан. Например: если вы хотите взять имя файла или файлоподобный объект, вы не можете использоватьisinstance(arg, file)потому что есть многие файлоподобные объекты, которые не являются подклассомfile(как те, которые возвращаются из urllib, или StringIO, или...). Обычно лучше всего, чтобы вызывающий просто сказал вам явно, какой объект имел в виду, используя различные аргументы ключевого слова.
в приведенном примере используйте значения по умолчанию:
class City: def __init__(self, name="Default City Name"): ... ...В общем, у вас есть два варианта:
1) Do
if-elifблоки на основе типа:def __init__(self, name): if isinstance(name, str): ... elif isinstance(name, City): ... ...2) Используйте duck typing - - - то есть предположим, что пользователь вашего класса достаточно умен, чтобы использовать его правильно. Это, как правило, предпочтительный вариант.
Джек М. прав, сделайте это так:
>>> class City: ... def __init__(self, city=None): ... self.city = city ... def __repr__(self): ... if self.city: return self.city ... return '' ... >>> c = City('Berlin') >>> print c Berlin >>> c = City() >>> print c >>>
самый простой способ - через ключевые аргументы:
class City(): def __init__(self, city=None): pass someCity = City(city="Berlin")Это довольно простой материал, может быть, посмотрите на документы python?
Comments