何时使用关键字参数进行类初始化?

时间:2019-04-26 14:16:30

标签: python class oop keyword-argument

在创建自己的类时,我无法确定何时应该或不应该使用关键字参数。

是否有任何特定情况或一般经验法则?

据我所知:

优点:

  1. 明确的定义使变量难以以错误的顺序放置
  2. 使代码更具可读性

缺点:

  1. 通过具有关键字参数,您还需要提供一个默认值,这意味着实例可以在不提供任何参数的情况下进行初始化。

请参见下面的MyClassA和MyClassB,它们说明了这两点:

class MyClassA():

    def __init__(self,name,city):

        self.name = name
        self.city = city

x = MyClassA('Andy','New York')



class MyClassB():

    def __init__(self,name=None,city=None):

        self.name = name
        self.city = city

 y = MyClassB(city='New York',name='Andy')

2 个答案:

答案 0 :(得分:3)

实际上,在两种情况下,您都可以将参数作为关键字参数传递:

x = MyClassA(city='New York', name='Andy')

也可以。这:

x = MyClassA(name='Andy', city='New York')

也可以。

一般经验法则(IMHO):如果在呼叫站点很明显有哪些参数,则-不需要关键字,否则-显式优于隐式

仅供参考,您可以像这样强制使用关键字args:

def fun(positional_arg1, *, keyword_only_arg1, keyword_only_arg2): ...

这意味着您不能使用位置参数调用fun

>>> fun(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fun() takes 1 positional argument but 3 were given

,您必须提供所有参数:

>>> fun(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fun() missing 2 required keyword-only arguments: 
'keyword_only_arg1' and 'keyword_only_arg2'

所以调用fun的唯一方法是:

fun(1, keyword_only_arg1=1, keyword_only_arg2=3)

答案 1 :(得分:0)

在两种情况下,您可以使用argument=value

1-使用具有很多参数但只想设置特定参数的函数时

def function(a=None, b=0, c=1, d=None, ......................z=None):
    .....
    return value

function(d='walk', g=4)

2-如chepner

所示,当您不知道参数的顺序时
function(13,14, 'default', 'walk',......)
function(a=13, d='walk')