为什么/如何有些类需要每个可能的参数,有些不需要?

时间:2014-02-19 11:21:32

标签: python parameters tkinter arguments

我最近一直在使用tkinter和Python,我一直对在tkinter中创建对象实例时传递参数的方式感到困惑。

当我自己创建一个类时,每个可以传递的参数都会传递 。但是,在tkinter中创建任何窗口小部件的实例时,并不是每个可能的参数都必须立即传递。它们每个都默认为特定值。请考虑用于创建画布小部件的代码:

canvas = tkinter.Canvas(root, width = 400, height = 250)

值(400,25)甚至不需要按顺序传递,它们由值之前的名称(宽度,高度)标识。我可以指定其他值(例如:背景,边框),但没有必要,因为默认值很好。

我已经搜索了很长时间试图找到答案,但是,由于我不完全确定如何称呼这些特殊论点,所以很难找到任何关于此的文章。

3 个答案:

答案 0 :(得分:3)

  1. 有一些叫做默认参数

    的东西
    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
    

    这里,如果没有传递参数,则假定定义中指定的默认值。

  2. 如果您想接受许多参数,可以在参数部分解压缩它们,如

    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'
    

    此处,在第一种情况下,saladcabbage已分配给var1var2,但其余值已分配给args作为一个元组。

    第二和第三种情况与第一种情况相同。

    第四种情况没有额外的参数,因此args将为空。

    第五种情况没有额外的参数,var2没有值,因此args将为空,并假定cabbage的默认值(var2

    在第六种情况下,var1未提供任何默认值。因此,它失败并出现at-least 1 argument expected错误。

    在第七种情况下,在未命名的参数之前使用var2(命名变量)。这在Python中是错误的。

    在第八种情况下,var2(命名变量)和puppy位置参数)都设置为var2。现在,Python无法确定var2使用哪个值。所以,它失败了。

  3. 在前面的例子中,我们看到了如何处理默认参数和命名参数。现在,命名参数也称为关键字参数,通常表示为**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字典中。

  4. 注意:请记住函数定义中*中的*args**中的**kwargs。它们负责传递给函数的参数的打包。

答案 1 :(得分:1)

我们举一个例子。

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

Canvas小部件会发生类似的事情。你可以在这里看到参考: https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/canvas.html

答案 2 :(得分:0)

声明方法时,您可以指定默认值。例如:

def __init__(self, a, b, c=True, d="default value"):
    ....