Rei*_*ica 123 python oop inheritance class introspection
给定一个类Foo(无论它是否是一个新类),如何生成所有基类 - 在继承层次结构中的任何位置 - 它issubclass?
Joc*_*zel 179
inspect.getmro(cls)适用于新旧样式类,并NewClass.mro()按照用于方法解析的顺序返回相同的类:列表及其所有祖先类.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
Run Code Online (Sandbox Code Playgroud)
Cre*_*esh 41
查看python上可用的__bases__属性class,其中包含基类的元组:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
Run Code Online (Sandbox Code Playgroud)
Ned*_*der 32
inspect.getclasstree()将创建一个嵌套的类及其基础列表.用法:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
Run Code Online (Sandbox Code Playgroud)
man*_*del 20
你可以使用__bases__类对象的元组:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Run Code Online (Sandbox Code Playgroud)
返回的元组__bases__具有所有基类.
希望能帮助到你!
YaO*_*OzI 14
根据Python doc,我们也可以简单地使用class.__mro__属性或class.mro()方法:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
Run Code Online (Sandbox Code Playgroud)
Ser*_*jik 12
在python 3.7中你不需要导入inspect,type.mro会给你结果。
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
Run Code Online (Sandbox Code Playgroud)
注意在 python 3.x 中,每个类都继承自基对象类。