【发布时间】:2022-01-03 22:03:09
【问题描述】:
我正在尝试开发一种机制来检测对继承具有鲁棒性的无效 kwargs。我想创建一个具有检查意外 kwargs 的 init 方法的类,并且我想创建另一个类,该类继承自第一个类并具有相同的 kwarg 检查。这可能比两层更深,但我认为解决两层可以进一步外推。这是我的尝试:
class MyClass(object):
def __init__(self, **kwargs):
# possible kwargs and default values
self._kwargs_def = {
'a':1,
'b':2,
'c':3,
}
self.a = kwargs.pop('a', self._kwargs_def['a'])
self.b = kwargs.pop('b', self._kwargs_def['b'])
self.c = kwargs.pop('c', self._kwargs_def['c'])
assert len(kwargs) == 0, f"Invalid kwargs: {kwargs.keys()}"
class MyChildClass(MyClass):
def __init__(self, **kwargs):
super.__init__() # run once to generate _kwargs_def
# repeat to override defaults with any appropriate kwargs
super.__init__(**{key:val for key, val in kwargs.items() if key in super._kwargs_def})
self._kwargs_def.update({'d':4, 'e':5})
self.d = kwargs.pop('d', self._kwargs_def['d'])
self.e = kwargs.pop('e', self._kwargs_def['e'])
assert len(kwargs) == 0, f"Invalid kwargs: {kwargs.keys()}"
my_instance = MyClass(a=7) # works
# I need a way around this: TypeError: descriptor '__init__' of 'super' object needs an argument
my_child_instance = MyChildClass(e=37) # doesn't work but should???
my_instance = MyClass(z=7) # fails and should fail
my_child_instance = MyChildClass(z=37) # fails but for wrong reason
【问题讨论】:
-
您发布的代码有什么问题?
-
调用
super().__init__()两次似乎并不安全。__init__()方法通常有副作用,它们不应该被多次调用。 -
您对
super().__init__()的第二次调用会检查您传递的kwards,但不会将它们从您的kwargs字典中删除。因此,您的len(kwargs)检查失败,因为父关键字仍在字典中。 -
错字:
super.__init__()应该是super().__init__()
标签: python inheritance keyword-argument