Несколько конструкторов в Python? [дубликат]

Возможный дубликат:
Что такое чистое, pythonic способ иметь несколько конструкторов в Python?

Разве не возможно определить несколько конструкторов в Python с различными подписями? В противном случае, каков общий способ обойти его?

Например, скажем, Вы хотели определить класс City

Я хотел бы смочь сказать someCity = City() или someCity = City("Berlin"), где первое просто дает значение имени по умолчанию, и второе определяет его.

198
задан Community 23 May 2017 в 02:34
поделиться

5 ответов

В прошлом я использовал 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
271
ответ дан 23 November 2019 в 05:10
поделиться

Для примера, который вы дали, используйте значения по умолчанию:

class City:
    def __init__(self, name="Default City Name"):
        ...
    ...

В общем, у вас есть два варианта:

1) сделать , если - - блоки на основе типа:

def __init__(self, name):
    if isinstance(name, str):
        ...
    elif isinstance(name, City):
        ...
    ...

2) Используйте набрав уток --- то есть, предположим, что пользователь вашего класса достаточно интеллектуальный, чтобы использовать его правильно. Это, как правило, предпочтительный вариант.

9
ответ дан 23 November 2019 в 05:10
поделиться

Джек М. справа, сделайте это так:

>>> 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

>>>
3
ответ дан 23 November 2019 в 05:10
поделиться

Если Ваши подписи отличаются только числом аргументов , использующих аргументы по умолчанию, то это правильно. Если вы хотите иметь возможность передавать различные виды аргументов, я постараюсь избежать подхода, основанного на 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, или...). Обычно лучше просто попросить вызывающего абонента явно сказать вам, что за объект имел в виду, используя различные аргументы по ключевым словам.

223
ответ дан 23 November 2019 в 05:10
поделиться

Самый простой способ - это аргументы ключевых слов:

class City():
  def __init__(self, city=None):
    pass

someCity = City(city="Berlin")

Это довольно базовые вещи, может быть, посмотрите на документы Python ?

6
ответ дан 23 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: