- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图理解在 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__
的错误调用(我在其中使用了 args
和 kwds
而不是 *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 : {}
那么为什么在 s1
和 s2
中,__init__
假设 moves = True
和 num_legs = 0
或 1
是关键字参数,并将 num_legs
设置为字典?
在 s3
中,它将两个变量解压到 moves
(在类 Animal
中)作为一个元组。
我在尝试理解参数拆包时无意中发现了这一点。提前抱歉——我不知道如何更好地提出这个问题。
最佳答案
在Snake.__init__
中,args
是poisonous
之后所有位置参数的元组,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/
我正在使用 python 使用 pandas 来制作一些 EDA 绘图。绘图的默认格式如下所示: 但是如果我做了一些更复杂的过滤,就像这样: s = (coupon_list[[ 'USABLE_DA
我昨天刚开始构建一个基于文本的游戏作为学习 Python 的练习(我使用的是 3.3)。我说的是“基于文本的游戏”,但我的意思更多的是 MUD 而不是选择你自己的冒险。不管怎样,当我昨天弄清楚如何使用
我试图理解在 Python 中创建子类时 *args 和 **kwds 的用法。 我想了解为什么这段代码会这样运行。如果我在调用 super().__init__ 时遗漏了 *args 和 **kwd
关键字参数是否有 python 命名约定? 最佳答案 不,但通常将其命名为 **kwargs,但您可以随意命名。唯一的问题是它应该在任何位置 args 和命名 args 之后的最后。 关于python
我是一名优秀的程序员,十分优秀!