使用super()将参数传递给正确的继承类

时间:2012-05-12 19:43:27

标签: class python-3.x

假设一个类继承了2个类:一个接受1个参数,另一个接受none。 如何确保将参数传递给接受参数的类,而不依赖于子类的顺序?

具体来说,我对这个例子有疑问:

class Generic(object):
    def __init__(self,data): 
        self.data=data
    def do_data(self):
        print(self.data)
class Generic2(object):
    def __init__(self):
        pass
    def no_data(self):
        print("No_data")
class MyClass(Generic2,Generic):
    def __init__(self,data):
        self.data=data
        super().__init__(data)
A=MyClass("A")

由于 init 参数而返回TypeError。

使用以下命令纠正错误:

  ...
 class MyClass(Generic,Generic2):
  ...

我假设super()使用MRO来决定要初始化哪个类。

问题是:在Python3中,我如何确保将参数发送到正确的子类,而不依赖于我的子类的顺序?

(温柔......我对OO的任何事情都有非常不稳定的知识!)

2 个答案:

答案 0 :(得分:3)

相关:https://fuhm.net/super-harmful/

只需使用您想直接初始化的课程:

class MyClass(Generic2, Generic):
    def __init__(self, data):
        Generic.__init__(data)
        self.data = data

答案 1 :(得分:1)

对于评论而言,某些扩展和评论太长了:

当您确切知道类层次结构的外观时,可以直接调用要调用的方法。当您不确定类层次结构的外观时,必须使用super()。例如,当您创建库时就是这种情况。您不知道人们将如何使用该库以及他们将使用哪些基类。所以你需要确保所有类的接口都相同,并且所有类都调用super()。

但是只要类的接口不相同,super()就会停止变得有用,部分原因是你不再能以任意顺序调用类。您现在必须按特定顺序初始化它们,然后您必须明确该命令。