在我阅读Django文档时,我在示例中看到了这一点:
from django.db import models
class HandField(models.Field):
description = "A hand of cards (bridge style)"
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 104
super(HandField, self).__init__(*args, **kwargs)
我不明白为什么对super的调用是:
super(HandField, self).__init__(*args, **kwargs)
然而(来自C编程)我认为它应该是:
super(HandField, self).__init__(args, kwargs)
怎么来的?
是。而且我不是说“*
”和“**
”(链接标记为重复)是什么意思,我问为什么它没有被重新发送没有明星=为什么它会重新发送给带有星星的父,这对我来说意味着:“字典词典”。我的问题与重复链接不同,重复链接无法解答我的问题。
答案 0 :(得分:1)
您使用*
/ **
的原因是解压缩您给出的打包值。初始化类时,可能会使用以下命令初始化:
HandField(1, 2, 3, abc=4, xyz=5)
因为它使用可变长度位置(*
)和动态关键字(**
)参数接收参数(以避免需要记住和处理其父类构造函数接收的细节),收到args
(1, 2, 3)
,kwargs
为{'abc': 4, 'xyz': 5}
。如果父类定义为__init__
:
def __init__(self, a1, a2, a3, spam=6, eggs=7, abc=None, xyz=None):
然后调用super(HandField, self).__init__(args, kwargs)
会将args
tuple
传递为a1
,将kwargs
dict
传递为a2
,然后传递对a3
或其他论点一无所知。通过unpacking args
and kwargs
,您可以转换回单个位置和关键字参数,因此a1
将获得1
,a2
2
,a3
{{1 },3
abc
和4
xyz
。
基本上,他们是反向操作;如果你接受5
,那么调用者将逐个传递位置参数,并且它们被#34;打包"进入单个*
,接受tuple
接受单个关键字参数"打包"作为单个**
。如果你想以同样的方式传递它们,你可以解压缩"他们使他们成为个人论点,而不是争论的集合。