Python 为什么/为什么有些类需要所有可能的参数,而有些类不需要';T
我最近在Python中使用了tkinter,我对在tkinter中创建对象实例时传递参数的方式感到困惑 当我自己创建一个类时,所有可能被传递的参数都必须被传递。但是,在tkinter中创建任何小部件的实例时,并非所有可能的参数都必须立即传递。它们各自默认为一个特定的值。考虑用于创建画布控件的代码:Python 为什么/为什么有些类需要所有可能的参数,而有些类不需要';T,python,parameters,tkinter,arguments,Python,Parameters,Tkinter,Arguments,我最近在Python中使用了tkinter,我对在tkinter中创建对象实例时传递参数的方式感到困惑 当我自己创建一个类时,所有可能被传递的参数都必须被传递。但是,在tkinter中创建任何小部件的实例时,并非所有可能的参数都必须立即传递。它们各自默认为一个特定的值。考虑用于创建画布控件的代码: canvas = tkinter.Canvas(root, width = 400, height = 250) 值(400、25)甚至不需要按顺序传递,它们由值之前的名称(宽度、高度)标识。我还可
canvas = tkinter.Canvas(root, width = 400, height = 250)
值(400、25)甚至不需要按顺序传递,它们由值之前的名称(宽度、高度)标识。我还可以指定其他值(例如:background、border),但无需指定,因为默认值是可以的
我搜索了很长一段时间试图找到答案,但是,由于我不完全确定这些特殊参数的名称,因此很难找到任何关于这一点的文字。让我们举个例子
def spam(a=1, b=2, c=3):
print a, b, c
此函数有三个参数,所有参数都有默认值。所以我可以在很多方面使用这个函数
>>> spam() # uses the default values
1 2 3
>>> spam(3) # use default for b and c
3 2 3
>>> spam(c=4, b=2, a=6) # explicitly assign values
6 2 4
>>> spam(b=7) # only assign b, use defaults for a and c
1 7 3
画布小部件也会发生类似的情况。您可以在此处查看参考:
让我们举个例子
def spam(a=1, b=2, c=3):
print a, b, c
此函数有三个参数,所有参数都有默认值。所以我可以在很多方面使用这个函数
>>> spam() # uses the default values
1 2 3
>>> spam(3) # use default for b and c
3 2 3
>>> spam(c=4, b=2, a=6) # explicitly assign values
6 2 4
>>> spam(b=7) # only assign b, use defaults for a and c
1 7 3
画布小部件也会发生类似的情况。您可以在此处查看参考:
声明方法时,可以指定默认值。例如:
def __init__(self, a, b, c=True, d="default value"):
....
声明方法时,可以指定默认值。例如:
def __init__(self, a, b, c=True, d="default value"):
....
def default_parameters(var1 = "cabbage"):
print var1
default_parameters(var1 = "salad") # salad
default_parameters("salad") # salad
default_parameters() # cabbage
default_parameters("salad", "cabbage") # Error! Expects only one parameter
此处,如果未传递任何参数,则假定定义中指定的默认值def many_parameters(var1, var2 = "cabbage", *args):
print var1, var2, args
many_parameters("salad", "cabbage", "rabbit", "ninja", "puppy")
# salad cabbage ('rabbit', 'ninja', 'puppy')
many_parameters("salad", "cabbage", "rabbit", "ninja")
# salad cabbage ('rabbit', 'ninja')
many_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',)
many_parameters("salad", "cabbage")
# salad cabbage
many_parameters("salad")
# salad cabbage
many_parameters()
# many_parameters() takes at least 1 argument (0 given)
many_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
many_parameters("salad", "puppy", var2 = "ninja")
# many_parameters() got multiple values for keyword argument 'var2'
这里,在第一种情况下,sala
和colla
被分配给var1
和var2
,但其余的值作为元组分配给args
第二和第三种情况与第一种情况相同
第四种情况没有额外的参数,因此args
将为空
第五种情况没有额外的参数,并且var2
没有值,因此args
将为空,并且假定var2
为默认值(colla
)
在第六种情况下,var1
没有提供任何默认值。因此,它会失败,至少预期有一个参数出现错误
在第七种情况下,在未命名参数之前使用var2
(命名变量)。这在Python中是错误的
在第八种情况下,var2
(命名变量)和puppy
(位置参数)都被设置为var2
。现在,Python无法决定将哪个值用于var2
。因此,它失败了**kwargs
,它实际上是所有命名参数的键值对字典注意:默认参数不算作关键字参数
def all_parameters(var1, var2 = "cabbage", *args, **kwargs):
print var1, var2, args, kwargs
all_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',) {}
all_parameters("salad", "cabbage")
# salad cabbage () {}
all_parameters("salad")
# salad cabbage () {}
all_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
all_parameters("salad", "puppy", var2 = "ninja")
# all_parameters() got multiple values for keyword argument 'var2'
all_parameters("salad", moderator="jonclements", python="martijinpieters")
# salad cabbage () {'moderator': 'jonclements', 'python': 'martijinpieters'}
我相信,除最后一项外,前面两个例子已经介绍了所有其他项目。在最后一种情况下,所有非默认但命名的参数都存储在kwargs
字典中*args
中的*
和**kwargs
中的*
。它们负责打包传递给函数的参数
def default_parameters(var1 = "cabbage"):
print var1
default_parameters(var1 = "salad") # salad
default_parameters("salad") # salad
default_parameters() # cabbage
default_parameters("salad", "cabbage") # Error! Expects only one parameter
此处,如果未传递任何参数,则假定定义中指定的默认值def many_parameters(var1, var2 = "cabbage", *args):
print var1, var2, args
many_parameters("salad", "cabbage", "rabbit", "ninja", "puppy")
# salad cabbage ('rabbit', 'ninja', 'puppy')
many_parameters("salad", "cabbage", "rabbit", "ninja")
# salad cabbage ('rabbit', 'ninja')
many_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',)
many_parameters("salad", "cabbage")
# salad cabbage
many_parameters("salad")
# salad cabbage
many_parameters()
# many_parameters() takes at least 1 argument (0 given)
many_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
many_parameters("salad", "puppy", var2 = "ninja")
# many_parameters() got multiple values for keyword argument 'var2'
这里,在第一种情况下,sala
和colla
被分配给var1
和var2
,但其余的值作为元组分配给args
第二和第三种情况与第一种情况相同
第四种情况没有额外的参数,因此args
将为空
第五种情况没有额外的参数,并且var2
没有值,因此args
将为空,并且假定var2
为默认值(colla
)
在第六种情况下,var1
没有提供任何默认值。因此,它会失败,至少预期有一个参数出现错误
在第七种情况下,在未命名参数之前使用var2
(命名变量)。这在Python中是错误的
在第八种情况下,var2
(命名变量)和puppy
(位置参数)都被设置为var2
。现在,Python无法决定将哪个值用于var2
。因此,它失败了**kwargs
,它实际上是所有命名参数的键值对字典注意:默认参数不算作关键字参数
def all_parameters(var1, var2 = "cabbage", *args, **kwargs):
print var1, var2, args, kwargs
all_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',) {}
all_parameters("salad", "cabbage")
# salad cabbage () {}
all_parameters("salad")
# salad cabbage () {}
all_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
all_parameters("salad", "puppy", var2 = "ninja")
# all_parameters() got multiple values for keyword argument 'var2'
all_parameters("salad", moderator="jonclements", python="martijinpieters")
# salad cabbage () {'moderator': 'jonclements', 'python': 'martijinpieters'}
我相信,除最后一项外,前面两个例子已经介绍了所有其他项目。在最后一种情况下,所有非默认但命名的参数都存储在kwargs
字典中*args
中的*
和**kwargs
中的*
。它们负责打包传递给函数的参数。请参阅