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()
这是对的吗?它似乎有效。
答案 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继承自B
和C
,这似乎是正确的做法。
我建议你像我刚才那样玩这个例子。添加一些print
,您会看到,在调用D().m()
时,类super().m()
中的B
语句本身会调用C.m()
。当然,如果您调用B().m()
(B
实例,而不是D
实例),则只调用A.m()
。换句话说,super().m()
中的B
知道它正在处理的实例的类,并相应地表现。
在所有地方使用super
听起来像是银弹,但你需要确保继承模式中的所有类都是合作(另一个要挖掘的关键字)并且不要打破链,例如在期望子类中的其他参数时。