我知道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)
答案 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, ...)