gpt4 book ai didi

Python 父/子类方法调用

转载 作者:行者123 更新时间:2023-11-30 22:58:10 27 4
gpt4 key购买 nike

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()

这是正确的吗?看来有效。

最佳答案

您可以使用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() lets you avoid referring to the base class explicitly, which can be nice. But the main advantage comes with multiple inheritance, where all sorts of fun stuff can happen. See the standard docs on super if you haven't already.

多重继承

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

How do you specify which super method you want to call?

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

有很多关于此的博客文章/SO 答案,您可以使用关键字“多重继承”、“钻石”、“MRO”找到em>”、“ 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 s,当调用D().m()时您会看到这一点,super().m()类里面的陈述B本身调用 C.m() 。当然,如果您调用 B().m() ( B 实例,而不是 D 实例),仅 A.m()叫做。换句话说,super().m()B知道它正在处理的实例的类并做出相应的行为。

使用super无处不在听起来像是 Elixir ,但您需要确保继承模式中的所有类都是合作的(另一个需要挖掘的关键字)并且不会破坏链条,例如当期望在 child 类。

关于Python 父/子类方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309644/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com