获取班级家长?

问题描述:

如何获得Python类的父类?获取班级家长?

+31

@FranckDernoncourt此线程现在是“python get parent class”的最高谷歌搜索结果。它比构成接下来的3个结果的其他SO问题略有关联。第五个结果是一个没有给出答案的Python文档页面,第六个结果最终是一个Python文档页面,它给出了答案,尽管深入一长页文本。 – 2012-05-17 18:26:33

+22

为什么有人会在对SO的解释更有说服力且易于访问时阅读文档?从我发现这个问题开始,直到我从Google到达这个页面时,我用了不到5秒的时间,而搜索文档至少需要我五次,可能几分钟。 – jononomo 2012-12-31 02:04:46

+6

作为一个想快速找到答案的人,搜索谷歌,找到了这个链接,并完成了我需要完成的工作:为什么人们(我认为斯洛特的评论已被删除)抱怨有人提出了一个有效的问题?是的,我知道我在这里的晚会非常晚。 – limasxgoesto0 2013-10-25 18:11:18

使用以下属性:

cls.__bases__ 

docs

类 对象的基类的元组。

例子:

>>> str.__bases__ 
(<type 'basestring'>,) 

又如:

>>> class A(object): 
... pass 
... 
>>> class B(object): 
... pass 
... 
>>> class C(A, B): 
... pass 
... 
>>> C.__bases__ 
(<class '__main__.A'>, <class '__main__.B'>) 

如果你想把所有的祖先而不仅仅是眼前的,使用inspect.getmro

import inspect 
print inspect.getmro(cls) 

有用地,这给你所有的祖先类在“方法解析顺序” - 即祖先在解析方法时将被检查的顺序(或者实际上,任何其他属性 - 方法和其他属性居于相同的毕竟,Python中的命名空间;-)。

+7

你也可以直接使用'cls .__ mro__'(至少在Python 3.5中) – naught101 2017-01-16 22:27:32

如果你想确保他们都被调用,请在各个级别使用super

+0

一旦你使用super,你必须在所有级别使用它,这就是为什么你应该明确地使用它。你也许想知道,超级不适用于每个班级...... – DasIch 2010-04-10 03:57:36

新样式类有一个你可以调用的mro方法,它以方法解析顺序返回一个父类的列表。

+0

什么是新式课程?看起来我可以在Django模型中使用它,但是从'object'继承的任何东西似乎都不会响应'mro'。 – 2015-06-15 14:21:11

+0

考虑对象'x',我们可以得到与呼叫 '型的方法解析顺序(X).mro()' 我们可以考虑,如果'x'有'ClassX'与基类: 'ClassX in type(x).mro()' – 648trindade 2017-01-15 01:11:10