【发布时间】:2019-03-11 21:08:07
【问题描述】:
我有以下设置:
class A:
def __init__(self, **kwargs):
# Some variables initialized
for k, v in kwargs.items():
setattr(self, k, v)
class B(A):
def __init__(self, **kwargs):
A.__init__(self, **kwargs)
self._b = {}
for k, v in kwargs.items():
setattr(self, k, v)
@property
def b(self):
return self._b
@b.setter
def b(self, value):
self._b.update(value)
class C(B):
def __init__(self, **kwargs):
B.__init__(self, **kwargs)
# Some variables initialized
for k, v in kwargs.items():
setattr(self, k, v)
当我现在创建 C 的新实例时,我收到以下错误:
AttributeError: 'C' object has no attribute '_b'
现在这很有意义,因为在调用 A.__init__(self, **kwargs) 时尚未初始化 B._b。我可以通过像这样重新排序 B 的初始化来解决这个问题,
class B(A):
def __init__(self, **kwargs):
self._b = {}
A.__init__(self, **kwargs)
for k, v in kwargs.items():
setattr(self, k, v)
当我需要在初始化期间将kwargs 从子类传递给父类时,我想了解是否有推荐/最佳实践方法?在我看来,以下事情会起作用,
- 像上面那样重新排序初始化
- 在每个子类中分配
kwargs,然后弹出它们并将剩余的kwargs传递给父类初始化 - 更好的东西
希望为 3 提供一些方法。
【问题讨论】:
-
“当我现在创建一个新的 C 实例时,出现以下错误” 我没有收到错误。 minimal reproducible example?
-
@Aran-Fey 你是对的我很抱歉我没有包含我提供的错误来源的属性设置器。上面的 B 类也执行以下操作,
@property def b(self): return self._b @b.setter def b(self, value): self._b.update(value) -
您在所有
__init__方法中循环kwargs的循环对我来说似乎是多余的。你为什么要在每节课上都这样做?要么只做一次,要么根本不做(让每个类接受它期望的任何命名参数,并且只使用kwargs作为父类的参数。请edit这个问题把关于b属性进入主要问题。没有这些信息没有任何意义,因此不应将其留在评论中。 -
我在@Blckknght 上面发表评论后确实更新了它。将在下面进一步回复您的回答
标签: python inheritance keyword-argument method-resolution-order