def print_root_left(class_):
while True:
print(class_)
# Check there if are no bases then we have reached the root class
if not class_.__bases__:
break
class_=class_.__bases__[0] # use the left most parent
example = "hello"
print_root_left(example.__class__)
9条答案
按热度按时间mrphzbgm1#
使用以下属性:
从文档中:
类对象的基类的元组。
范例:
另一个例子:
hxzsmxv22#
如果你想要所有的祖先,而不仅仅是直接的祖先,那么使用
cls.__mro__
。对于Python 3.5之前的版本,请使用
inspect.getmro
:很明显,这会按照“方法解析顺序”给出所有的祖先类--即:解析方法(或者,实际上,任何其他属性)时检查祖先的顺序--方法和其他属性毕竟在Python中位于同一个名称空间中;- ).
lxkprmvk3#
获取所有父对象的最快方法是使用
__mro__
内置。例如,
repr(YOUR_CLASS.__mro__)
。以下:
.输出,顺序如下:
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>, <type 'exceptions.Warning'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)
这就对了“最佳”答案可能会有更多的投票,但这比一些复杂的
for
循环要简单得多,一次只查看__bases__
中的一个类,更不用说当一个类扩展 * 两个 * 或更多的父类时。使用inspect
只是不必要地模糊了范围。wrrgggsh4#
新式类有一个
mro
方法,你可以调用它,它返回一个按方法解析顺序排列的父类列表。gfttwv5a5#
如果你只想得到父类,使用base,使用
__mro__
(如@naught101所指出的)来获得方法解析顺序(以便知道init的执行顺序)。Base(首先获取现有对象的类):
对于最近Python版本中的mro:
显然,当你已经有一个类定义时,你可以直接调用
__mro__
:xtupzzrd6#
如果你想确保它们都被调用,那么在所有级别都使用
super
。daolsyd07#
如果您有一个变量,并希望获取它的类和父类,请使用**type()**方法,该方法将为变量给予类
输出:
uhry853o8#
这个函数将打印一个对象的所有类,而在每一步中,下一个对象将是最左边的父对象。
a5g8bdjr9#