这在python super().__ init __(** kwargs)中是什么

时间:2017-01-30 05:49:49

标签: python

我知道super用于调用超类中的 init 方法,我无法理解kwargs我知道它需要关键参数

它在这做什么?

class LoginScreen(GridLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.cols = 2
        self.add_widget(Label(text = "Username: "))
        self.username = TextInput(multiline = False)
        self.add_widget(self.username)

        self.add_widget(Label(text="Password: "))
        self.username = TextInput(multiline=False, password=True)
        self.add_widget(self.username)

        self.add_widget(Label(text="Two Factor Auth: "))
        self.tffa = TextInput(multiline=False, password=True)
        self.add_widget(self.tffa)

2 个答案:

答案 0 :(得分:4)

def __init__(self, **kwargs):__init__的任何给定调用中使用的所有关键字参数打包到dict中,super().__init__(**kwargs)再次将它们扩展为关键字参数。它就像函数参数的通配符。它可以是一种懒惰的方式,为子类提供与父类相同的参数签名,而无需再次输入所有可能的关键字参数。只需抓住它们作为一个blob并将它们铲到父母那里去弄清楚。

答案 1 :(得分:0)

例如你把这个:

x = LoginScreen(size=1, blahblah=2, something=3)

我们现在有:

>>> print(kwargs)
{'size': 1, 'blahblah': 2, 'something': 3}

所以如果它到达以下行:super().__init__(**kwargs) 它将等于:super().__init__(size=1, blahblah=2, something=3)

小心:如果你没有放双星号“**”,它将等于一个参数作为键:

`super().__init__({'size': 1, 'blahblah': 2, 'something': 3})`

你也可以这样使用它:

options = [1,2,3]
def func(first=None, second=None, last=None):
    print("first arg:", first)
    print("second arg:", second)
    print("third arg:", last)

func(*options)

这里我们使用一个星号,因为这是一个列表而不是字典,这意味着扩展每个参数的选项列表,输出将是:

first arg: 1
second arg: 2
third arg: 3

但是如果我们调用不带星号的选项。

func(options)

看看会发生什么:

first arg: [1, 2, 3]
second arg: None
third arg: None

与 kwargs 相同,只是它们是这样的:

fuction(key1=value1, key2=value2, key3=value3, ...)