gpt4 book ai didi

Python super() 传入 *args

转载 作者:行者123 更新时间:2023-12-04 08:54:02 28 4
gpt4 key购买 nike

我对传递的约定感到困惑*argssuper().__init__()在python继承中。
我了解需要使用关键字参数 **kwargs因此,如果需要,CRO 中的类可以采用所需的参数,但为什么还有一个 *args ?
例子:
假设 Sneaky 用作多继承类结构的一部分,例如:

class Sneaky:
def __init__(self, sneaky = false, *args, **kwargs):
super().__init__(*args, **kwargs)
self.sneaky = sneaky

class Person:
def __init__(self, human = false, *args, **kwargs):
super().__init__(*args, **kwargs)
self.human = human

class Thief(Sneaky, Person):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

t = Thief(human = true, sneaky = true)
print(t.human)
# True
那么,如果我们在下面改为删除 *args 呢?
class Sneaky:
def __init__(self, sneaky = false, **kwargs):
super().__init__( **kwargs)
self.sneaky = sneaky

class Person:
def __init__(self, human = false, **kwargs):
super().__init__(**kwargs)
self.human = human

class Thief(Sneaky, Person):
def __init__(self, **kwargs):
super().__init__( **kwargs)

t = Thief(human = true, sneaky = true)
print(t.human)
# True

最佳答案

路过 *args意味着您可以初始化您的 Thief喜欢

>> x = Thief(True, False)
>> x.human
False
>> x.sneaky
True
这读起来令人困惑,并且难以通过多重继承进行跟踪,但它可能很有用。保持这种能力意味着你可以做
sneaky = (True, False, True,)
human = (True, False, False,)
thieves = [Thief(*args) for args in zip(sneaky, human)]
这有点做作,但我认为它说明了为什么您可能想要允许位置参数。
如果您确实想删除 *args并且不支持位置参数,您可以从 Sneaky 中排除它们和 Person以及添加 *,之后 self, .
class Sneaky:

def __init__(self, *, sneaky=False, **kwargs):
super().__init__(**kwargs)
self.sneaky = sneaky

class Person:

def __init__(self, *, human=False, **kwargs):
super().__init__(**kwargs)
self.human = human
这不会将所有位置参数放在未命名的 * 中.这将引发 TypeError如果您尝试提供位置参数。

关于Python super() 传入 *args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63939055/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com