Python 为什么/为什么有些类需要所有可能的参数,而有些类不需要';T

Python 为什么/为什么有些类需要所有可能的参数,而有些类不需要';T,python,parameters,tkinter,arguments,Python,Parameters,Tkinter,Arguments,我最近在Python中使用了tkinter,我对在tkinter中创建对象实例时传递参数的方式感到困惑 当我自己创建一个类时,所有可能被传递的参数都必须被传递。但是,在tkinter中创建任何小部件的实例时,并非所有可能的参数都必须立即传递。它们各自默认为一个特定的值。考虑用于创建画布控件的代码: canvas = tkinter.Canvas(root, width = 400, height = 250) 值(400、25)甚至不需要按顺序传递,它们由值之前的名称(宽度、高度)标识。我还可

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

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

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
    
    此处,如果未传递任何参数,则假定定义中指定的默认值

  • 如果您想接受许多参数,可以在arguments部分将它们解压缩,如下所示

    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
    
    此处,如果未传递任何参数,则假定定义中指定的默认值

  • 如果您想接受许多参数,可以在arguments部分将它们解压缩,如下所示

    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
    中的
    *
    。它们负责打包传递给函数的参数。

    请参阅