如何根据Python中的对象实例推断类层次结构?

4 投票
4 回答
3484 浏览
提问于 2025-04-15 15:15

有没有办法在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,并使用它的自动补全功能:-)

撰写回答