Python父/子类方法调用

时间:2016-03-30 13:00:22

标签: python

Linux上的Python 2.7.6。

我正在使用从父级继承的测试类。父类包含许多子类共有的字段,我需要调用父setUp方法来初始化字段。调用ParentClass.setUp(self)正确的方法吗?这是一个简单的例子:

class RESTTest(unittest.TestCase):
    def setUp(self):
        self.host = host
        self.port = port
        self.protocol = protocol
        self.context = context

class HistoryTest(RESTTest):
    def setUp(self):
        RESTTest.setUp(self)
        self.endpoint = history_endpoint
        self.url = "%s://%s:%s/%s/%s" %(self.protocol, self.host, self.port, self.context, self.endpoint)

    def testMe(self):
        self.assertTrue(True)

if __name__ == '__main__':
    unittest.main()

这是对的吗?它似乎有效。

1 个答案:

答案 0 :(得分:3)

您可以使用super

super(ChildClass, self).method(args)

class HistoryTest(RESTTest):
    def setUp(self):
        super(HistoryTest, self).method(args)
        ...

在Python 3中,你可以写:

class HistoryTest(RESTTest):
    def setUp(self):
        super().method(args)
        ...

更简单。

请参阅this answer

  

super()可以避免显式引用基类,这可能很好。但主要优势在于多重继承,其中可能发生各种fun stuff。如果您还没有,请查看standard docs on super

多重继承

要(试着)回答你评论中的问题:

  

如何指定要调用的超级方法?

根据我对多重继承哲学的理解(在Python中),你不会。我的意思是,super以及方法解决顺序(MRO)应该做正确的事情并选择适当的方法。 (是的方法是复数,见下文。)

关于此,您可以找到很多博客帖子/ SO答案,您可以使用关键字" 多重继承"," 钻石 "," MRO "," super "等。This article提供了Python 3例如,我发现令人惊讶,并没有在其他来源找到:

class A:
    def m(self):
        print("m of A called")

class B(A):
    def m(self):
        print("m of B called")
        super().m()

class C(A):
    def m(self):
        print("m of C called")
        super().m()

class D(B,C):
    def m(self):
        print("m of D called")
        super().m()

D().m()

m of D called
m of B called
m of C called
m of A called

请参阅?感谢B.m()C.m()super都会被调用,考虑到D继承自BC,这似乎是正确的做法。

我建议你像我刚才那样玩这个例子。添加一些print,您会看到,在调用D().m()时,类super().m()中的B语句本身会调用C.m()。当然,如果您调用B().m()B实例,而不是D实例),则只调用A.m()。换句话说,super().m()中的B知道它正在处理的实例的类,并相应地表现。

在所有地方使用super听起来像是银弹,但你需要确保继承模式中的所有类都是合作(另一个要挖掘的关键字)并且不要打破链,例如在期望子类中的其他参数时。