python - Python super() 传入 *args
问题描述
我对传入python 继承*args
的约定感到困惑。super().__init__()
我知道需要使用关键字参数**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
like
>> 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)]
这有点做作,但我认为它说明了为什么您可能希望允许位置参数。
如果您确实想删除并且不支持位置参数,您可以通过添加after*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
如果您尝试提供位置论据,这将引发 a 。
推荐阅读
- video - 如何摆脱黑色边框(视频)?
- python - 包含“n”前行和“m”后行的熊猫滚动窗口
- php - 数组数组的php计数 - 与预期不同的值
- c - glibc 的 isalpha 函数和 en_US.UTF-8 语言环境
- python - Tkinter画布问题,3天前开始编码
- python - 如何转换数据框
- wordpress - 在 wordpress 仪表板中找不到页面源代码
- hadoop-yarn - 在 EMR 中取消 YARN 步骤
- php - insertafter 数据卡在其上方的单元格中
- ruby-on-rails - ActiveRecord::SubclassNotFound:无效的单表继承类型:User::Admin 不是 User 的子类