python - 为什么/为什么有些类需要所有可能的参数,而有些则不需要?

标签 python parameters tkinter arguments

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

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

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

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

我搜索了很长时间试图找到答案,但是,由于我不完全确定如何称呼这些特殊参数,因此很难找到关于此的任何内容。

最佳答案

  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 中。词典。

注意:记住**args****kwargs , 在函数定义中。他们负责打包传递给函数的参数。

关于python - 为什么/为什么有些类需要所有可能的参数,而有些则不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878993/

相关文章:

ruby - 将 splat 参数从一种方法传递到另一种方法

python - 在 OOP Python tkinter 中的多个类中使用具有相同参数的一个函数的最佳方法是什么

python - 从 tkinter 中的文本小部件复制格式化文本

python - Pandas 排序值

python - 使用 AJAX 进行验证以确保数据库中没有放置相同的电子邮件

function - 在 AutoIT 中将函数作为参数传递

c++ - 如何在函数内部访问 Mat 类型参数的变量名

python - 通过Rust的派生生成Python Tkinter进程不会持续提供stdout

Python OpenCV 在中心坐标列表处绘制圆

python - 列表理解 : why is this a syntax error?