【发布时间】:2020-05-16 16:46:13
【问题描述】:
我正在尝试设计一个类结构,允许用户定义自己的类,该类重载其他类中的预定义方法。在这种情况下,用户将创建 C 类以重载 D 中的“函数”方法。用户创建的 C 类与其他用户创建的类 A 和 B 具有共同逻辑,因此它们从 C 继承以重载“函数”,但也继承自D 使用 D 的其他方法。我遇到的问题是如何将“值”从 A 和 B 传递给 D,而忽略将其传递给 C。我目前写的内容会产生错误,因为 C 没有“值”作为参数。
我知道我可以将“值”(或 *args)添加到 C 的 init 方法和超级调用,但我不想知道其他类需要什么输入才能将新类添加到 A 和 B . 另外,如果我交换 C 和 DI 的顺序不会出错,但是我不使用 C 的重载“函数”。有没有明显的解决方法?
class D(SomethingElse):
def __init__(self, value, **kwargs):
super(D, self).__init__(**kwargs)
self.value = value
def function(self):
return self.value
def other_method(self):
pass
class C(object):
def __init__(self):
super(C, self).__init__()
def function(self):
return self.value*2
class B(C, D):
def __init__(self, value, **kwargs):
super(B, self).__init__(value, **kwargs)
class A(C, D):
def __init__(self, value, **kwargs):
super(A, self).__init__(value, **kwargs)
a = A(3)
print(a.function())
>>> 6
【问题讨论】:
-
输出应该是什么?
-
我应该是 6 岁。我编辑了帖子以反映这一点。
-
好像是python2?它得到了不同的错误。我在
super(A, self).__init__(value, **kwargs)、__init__() takes 1 positional argument but 2 were given上的class A出现错误,因为super(A, self)试图引用class C,而它的__init__没有收到任何位置参数。我必须将*args, **kwargs添加到mehtioned__init__并写super(C, self).__init__(*args, **kwargs)并且一切正常。这是python3.6。 -
我知道它不起作用。这就是我发布的内容。我也知道添加 *ags 可以解决此问题。我只是想知道是否可以添加这些。 C 是自包含的,只是重载方法,它不需要知道输入参数是什么。我想知道是否有一种方法可以在不需要 args 和 kwargs 的情况下对其进行编码。
-
有方法解析顺序(MRO)。当函数丢失时,python 会尝试在其他地方搜索它(在基类中,它的基类等等)。当您写
super(YourClass, self)时,您指的是 MRO 中的下一个类。你可以写print(A.__mro__)你会得到[A, C, D, SomethingElse, object]。因此,class C应该知道class D应该收到的参数。最方便的方法是使用*args, **kwargs。请阅读,这个realpython.com/lessons/multiple-inheritance-python,可能包含更多细节。
标签: python multiple-inheritance