我可以在设置函数中调用基类方法吗?

时间:2019-04-17 06:57:00

标签: python

我是第一次编写python脚本 这是一个基本问题

class TestLolSupv(TestSetTxFreqPL4App,TestCaseAppForceReset):

    def setUp(self):
        super().setUp()
        super().test_TX_SET_FREQ_PL4P2_A001()

我可以在setUp函数中以这种方式直接调用基类方法吗? 另外,如果我继承多个基类,并且super.setup()执行哪两个?如果是这样的话,先哪个?

2 个答案:

答案 0 :(得分:1)

super.setup()将在所有父类中从左到右搜索setup方法,直到找到它并执行第一个找到的方法。

例如

class A(object):
  def setup(self):
    print("A")

class B(object):
  def setup(self):
    print("B")

class C(A, B):
  def setup(self):
    super().setup()

c = C()
c.setup()

将答案打印为“ A”。

如果父类继承自其他类,则将按该顺序搜索它们。

示例

class A(object):
  def setup(self):
    pass

class B(object):
  def setup(self):
    pass

class C(A):
  pass

class D(B):
  pass

class E(C, D):
  def setup(self):
    super().setup()

class F(D, C):
  def setup(self):
    super().setup()

现在,对于E,将执行A中的设置,对于F,将执行B中的设置。

答案 1 :(得分:0)

是的,执行super().setUp()是调用父方法类的正确方法。

现在,关于多重继承和方法调用。 Python实际上只会调用一个类的方法。当您进行多重继承时,Python会创建一个“多重解决方案顺序”,即python检查该方法的父类的顺序。一旦在父级中找到该方法,它将停止寻找该方法(通常会发生,因为继承层次结构可能很大)。

在您的示例中,您的解决顺序为:

[<class '__main__.TestLolSupv'>, <class '__main__.TestSetTxFreqPL4App'>, <class '__main__.TestCaseAppForceReset'>, <class 'object'>]

您可以通过运行TestLolSupv.mro()进行检查。

如果要控制对象被调用的顺序,我建议改用委托。而且,如果您使用继承来访问父类方法,则委托会更好。通常,当父类调用子类方法时,继承是值得的,因为这意味着您正在构建抽象。

这里有info关于python中的多重继承。