gpt4 book ai didi

python - python super 调用中的*args和**kwds

转载 作者:太空狗 更新时间:2023-10-29 18:23:13 24 4
gpt4 key购买 nike

我试图理解在 Python 中创建子类时 *args**kwds 的用法。

我想了解为什么这段代码会这样运行。如果我在调用 super().__init__ 时遗漏了 *args**kwds,我会得到一些奇怪的解包参数。

这是我的测试用例:

class Animal(object):
def __init__(self, moves, num_legs):
self.moves = moves
self.num_legs = num_legs

def describe(self):
print "Moves :{} , num_legs : {}".format(self.moves, self.num_legs)

class Snake(Animal):
def __init__(self, poisonous, *args, **kwds):
self.poisonous = poisonous
print "I am poisonous:{}".format(self.poisonous)
# This next line is key. You have to use *args , **kwds.
# But here I have deliberately used the incorrect form,
# `args` and `kwds`, and am suprised at what it does.
super(Snake, self).__init__(args, kwds)

现在,当我创建 Snake 子类的实例时,它包含对 super(…).__init__ 的错误调用(我在其中使用了 argskwds 而不是 *args**kwds),我得到了一些有趣的“参数解包”。

s1 = Snake(False, moves=True, num_legs=0)
s2 = Snake(poisonous=False, moves=True, num_legs=1)
s3 = Snake(False, True, 3)
s1.describe()
s2.describe()
s3.describe()

我得到的是:

Moves :() , num_legs : {'moves': True, 'num_legs': 0}
Moves :() , num_legs : {'moves': True, 'num_legs': 1}
Moves :(True, 3) , num_legs : {}

那么为什么在 s1s2 中,__init__ 假设 moves = Truenum_legs = 01 是关键字参数,并将 num_legs 设置为字典?

s3 中,它将两个变量解压到 moves(在类 Animal 中)作为一个元组。


我在尝试理解参数拆包时无意中发现了这一点。提前抱歉——我不知道如何更好地提出这个问题。

最佳答案

Snake.__init__中,argspoisonous之后所有位置参数的元组,kwds是一个除 poisonous 之外的所有关键字参数的字典。通过调用

super(Snake,self).__init__(args,kwds)

您将 args 分配给 moves 并将 kwds 分配给 Animal.__init__ 中的 num_legs >。这正是您在输出中看到的。

除了 poisonous 之外,前两个调用没有任何位置参数,因此 args 和相应的 moves 是一个空元组。第三个调用没有关键字参数,所以 kwds 和相应的 num_legs 是一个空字典。

关于python - python super 调用中的*args和**kwds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18751910/

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