Возможный дубликат:
Что такое чистое, pythonic способ иметь несколько конструкторов в Python?Разве не возможно определить несколько конструкторов в Python с различными подписями? В противном случае, каков общий способ обойти его?
Например, скажем, Вы хотели определить класс
City
Я хотел бы смочь сказать
someCity = City()
илиsomeCity = City("Berlin")
, где первое просто дает значение имени по умолчанию, и второе определяет его.
В прошлом я использовал NetBeans для проектов PHP и мне это очень понравилось. То, что мне понравилось, это только мое мнение, но я не помню никаких проблем с установкой. NetBeans отлично синхронизировался с моими командами SVN-сервером , и все работало нормально.
-121--3525899-try
function pulsate() {
$("#pulsating-block").animate({opacity: 0.2}, 3000,function(){
$(this).animate({opacity: 1}, 3000, null, function() {pulsate()});
});
}
-121--3357742- В отличие от Java, невозможно определить несколько конструкторов. Однако можно определить значение по умолчанию, если оно не передано.
def __init__(self, city="Berlin"):
self.city = city
Для примера, который вы дали, используйте значения по умолчанию:
class City:
def __init__(self, name="Default City Name"):
...
...
В общем, у вас есть два варианта:
1) сделать , если
- -
блоки на основе типа:
def __init__(self, name):
if isinstance(name, str):
...
elif isinstance(name, City):
...
...
2) Используйте набрав уток --- то есть, предположим, что пользователь вашего класса достаточно интеллектуальный, чтобы использовать его правильно. Это, как правило, предпочтительный вариант.
Джек М. справа, сделайте это так:
>>> 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
>>>
Если Ваши подписи отличаются только числом аргументов , использующих аргументы по умолчанию, то это правильно. Если вы хотите иметь возможность передавать различные виды аргументов, я постараюсь избежать подхода, основанного на isinstance
, упомянутого в другом ответе, вместо того, чтобы использовать аргументы по ключевому слову. Если использование только аргументов ключевых слов становится нецелесообразным, вы можете комбинировать его с одноклассными методами (код 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, или...). Обычно лучше просто попросить вызывающего абонента явно сказать вам, что за объект имел в виду, используя различные аргументы по ключевым словам.
Самый простой способ - это аргументы ключевых слов:
class City():
def __init__(self, city=None):
pass
someCity = City(city="Berlin")
Это довольно базовые вещи, может быть, посмотрите на документы Python ?