如何根据Python中的对象实例推断类层次结构?
有没有办法在Python中找出一个类的基类是什么?
比如说,给定以下的类定义:
class A:
def speak(self):
print "Hi"
class B(A):
def getName(self):
return "Bob"
如果我得到了一个对象的实例,我可以很简单地通过以下方式确认它是B类:
instance = B()
print B.__class__.__name__
这样会打印出类名'B',这正是我预期的结果。
有没有办法发现这个对象的实例不仅是某个类的实例,还继承了哪个基类呢?
还是说,这不是Python中对象的工作方式?
4 个回答
6
获取类的继承关系还有另一种方法,就是访问mro属性:
class A(object):
pass
class B(A):
pass
instance = B()
print(instance.__class__.__mro__)
# (<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
需要注意的是,在Python 2.x版本中,你必须使用“新式”对象,才能确保它们有mro属性。你可以通过这样声明来实现:
class A(object):
而不是:
class A():
想了解更多关于新式对象和mro(方法解析顺序)的信息,可以查看http://www.python.org/doc/newstyle/和http://www.python.org/download/releases/2.3/mro/。
在Python 3.x版本中,所有对象都是新式对象,所以你可以使用mro,并且可以这样简单地声明对象:
class A():
8
inspect模块真的很强大:
>>> import inspect
>>> inst = B()
>>> inspect.getmro(inst.__class__)
(<class __main__.B at 0x012B42A0>, <class __main__.A at 0x012B4210>)
6
b = B()
b.__class__
b.__class__.__base__
b.__class__.__bases__
b.__class__.__base__.__subclasses__()
我强烈建议你试试ipython,并使用它的自动补全功能:-)