2014-12-12 3 views
0

Предположим, у вас есть класс Python, конструктор выглядит примерно так:Вызов Python конструктор с аргументами по умолчанию

def __init__(self,fname=None,data=[],imobj=None,height=0,width=0): 

и вы хотите создать экземпляр этого, но только обеспечить Fname и imobj входы. Будет ли правильный способ сделать это:

thing = Thing(f_name, None, im_obj, None, None) 

или есть предпочтительный способ совершения этого звонка?

+0

Просто используйте именованные аргументы: «Thing (fname = f_name, imobj = im_obj)», все остальное по умолчанию. – swstephe

+0

Вы не хотите, чтобы 'data = []' как аргумент по умолчанию, как пишет iCodez ниже. То, что вы хотите, это 'data = None', затем в теле' __init__' вы можете написать 'if data None: self.data = []' или все, что вы планировали сделать с ним. – jme

ответ

6

Вы можете просто сделать:

thing = Thing(f_name=value1, im_obj=value2) 

Обратите внимание, что вы делаете на самом деле не необходимостьf_name= в данном случае, поскольку fname является первым параметром (помимо self, который передается неявно). Вы могли бы просто сделать:

thing = Thing(value1, im_obj=value2) 

Но я лично считаю, что первое решение более читаемо. Он дает понять, что мы меняем значения f_name и im_obj, оставляя каждый другой параметр равным его значению по умолчанию. Кроме того, это заставляет людей задаваться вопросом, какой параметр value1 будет назначен.

Кроме того, вы почти никогда не хотите, чтобы изменяемый объект, такой как список, был аргументом по умолчанию. Он будет использоваться для всех вызовов функции. Для получения дополнительной информации см "Least Astonishment" and the Mutable Default Argument

+0

* у вас никогда не должно быть изменяемого объекта, такого как список, как аргумент по умолчанию * - не обязательно ** никогда ** - но в 99% случаев это определенно не то, что вы хотите, и будете укусить вас. –

+0

Там я использовал «почти никогда». :-) – iCodez

0

Вы можете с созданием экземпляра:

thing = Thing(f_name, imobj=im_obj) 

Других названные аргументы будут установлены по умолчанию.

Вы также можете передать Dict конструктору:

>>> argDict={"fname": f_name, "imobj": im_obj} 
>>> thing = Thing(**argDict) 

Это распаковывать значения Dict. См. keyword arguments.

Смежные вопросы