我最近一直在将 tkinter 与 Python 结合使用,我对在 tkinter 中创建对象实例时传递参数的方式感到困惑。
当我自己创建一个类时,每个可能被传递的参数,都被传递。但是,在 tkinter 中创建任何小部件的实例时,并非必须立即传递所有可能的参数。它们各自默认为特定值。考虑用于创建 Canvas 小部件的这段代码:
canvas = tkinter.Canvas(root, width = 400, height = 250)
值 (400, 25) 甚至不需要按顺序传递,它们由值之前的名称 (width, height) 标识。我可以指定其他值(例如:背景、边框),但没有必要,因为默认值就可以了。
我搜索了很长时间试图找到答案,但是,由于我不完全确定如何称呼这些特殊参数,因此很难找到关于此的任何内容。
最佳答案
有个东西叫默认参数,
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'
在这里,在第一种情况下,
salad
和cabbage
分配给var1
和var2
, 但其余值分配给args
作为一个元组。第二种和第三种情况与第一种相同。
第四种情况没有额外的参数,所以
args
将是空的。第五种情况没有额外的参数,也没有
var2
的值。 , 所以args
将为空,默认值 (cabbage
) 假定为var2
.第六种情况,
var1
没有提供任何默认值。所以,它失败了at-least 1 argument expected
错误。在第七种情况下,
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
, 在函数定义中。他们负责打包传递给函数的参数。
关于python - 为什么/为什么有些类需要所有可能的参数,而有些则不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878993/