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



我的情况几乎与这个问题相同,只是我需要关键字参数。

我想将必需的关键字参数添加到派生类中,但无法弄清楚如何去做。尝试显而易见的事情

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

当然不起作用,因为没有指定新关键字。

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

类似的问题:如何在 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 中的仅关键字参数同时添加,其中指出:

仅关键字参数不需要具有默认值。由于 Python 要求所有参数都绑定到一个值,并且由于将值绑定到仅关键字参数的唯一方法是通过关键字,因此此类参数是"必需关键字"参数。此类参数必须由调用方提供,并且必须通过关键字提供。

需要明确的是,仅关键字参数(必需或默认(是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)

缺点是它不会显示在初始值设定项/类签名中,并且手动弹出这样的参数(在编写的代码和运行时中(成本更高。

最新更新