gpt4 book ai didi

python - 如何将必需的关键字参数添加到派生类的构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 11:12:04 25 4
gpt4 key购买 nike

我的情况和this question几乎一样除了我需要关键字参数是必需的。

我想向派生类添加required 关键字参数,但不知道如何去做。尝试显而易见的事情

class ClassA(some.package.Class):

def __init__(self, *args, **kwargs):
super(ClassA, self).__init__(*args, **kwargs)

class ClassB(ClassA):

def __init__(self, *args, a, b, c, **kwargs):
super(ClassB, self).__init__(*args, **kwargs)
self.a=a
self.b=b
self.c=c

失败是因为我无法为 ClassB__init__ 列出参数。和

class ClassB(ClassA):

def __init__(self, *args, **kwargs):
super(ClassA, self).__init__(*args, **kwargs)
self.a=a
self.b=b
self.c=c

当然不行,因为没有指定新的关键字。

如何将 required 关键字参数添加到派生类的 __init__

类似问题:How do I add keyword arguments to a derived class's constructor in Python?

最佳答案

不提供默认值,关键字参数是必需的:

class ClassB(ClassA):
def __init__(self, *args, a, b, c, **kwargs):
super().__init__(*args, **kwargs) # No need to pass arguments to super in Py3
self.a = a
self.b = b
self.c = c

它们仍然需要仅包含关键字,因为它们位于 *args 参数之后。

此功能是在 PEP 3102 中与仅关键字参数同时添加的,其中指出:

Keyword-only arguments are not required to have a default value. Since Python requires that all arguments be bound to a value, and since the only way to bind a value to a keyword-only argument is via keyword, such arguments are therefore 'required keyword' arguments. Such arguments must be supplied by the caller, and they must be supplied via keyword.

需要明确的是,仅限关键字的参数(必需或默认)是 Python 3 独有的功能。如果您尝试在 Python 2 上执行此操作,则不可能让 Python 为您完成这项工作,您只需要自己执行检查。移至 Python 3; Python 2 将于 2019 年底停产(没有补丁,甚至没有安全性),因此新代码无论如何都应该以 Python 3 为目标。

郑重声明,您在 Python 2 上使用的代码可能会很糟糕,例如:

class ClassB(ClassA):
def __init__(self, *args, **kwargs):
try:
self.a = kwargs.pop('a')
self.b = kwargs.pop('b')
self.c = kwargs.pop('c')
except KeyError as e:
# Convert to TypeError to match Python 3 behavior
raise TypeError("__init__ missing required keyword-only argument: {!s}".format(e))
super(ClassB, self).__init__(*args, **kwargs)

缺点是它不会出现在初始化程序/类签名中,并且手动弹出这样的参数(在编写的代码和运行时)的成本更高。

关于python - 如何将必需的关键字参数添加到派生类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57960951/

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