在Python中给定对象实例的情况下,如何计算类层次结构?

Fre*_*est 2 python oop inheritance

反正有没有在Python中发现类的基类?

给定以下类定义:

class A:
   def speak(self):
      print "Hi"

class B(A):
   def getName(self):
      return "Bob"
Run Code Online (Sandbox Code Playgroud)

如果我收到一个对象的实例,我可以通过执行以下操作轻松地确定它是B:

instance = B()
print B.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

其中按预期打印类名"B".

反正有没有发现对象的实例继承自基类以及实际的类?

或者这不是Python中的对象如何工作?

Ned*_*der 6

检查模块也非常强大:

>>> import inspect

>>> inst = B()
>>> inspect.getmro(inst.__class__)
(<class __main__.B at 0x012B42A0>, <class __main__.A at 0x012B4210>)
Run Code Online (Sandbox Code Playgroud)


ndi*_*dim 5

b = B()
b.__class__
b.__class__.__base__
b.__class__.__bases__
b.__class__.__base__.__subclasses__()
Run Code Online (Sandbox Code Playgroud)

我强烈建议您查看ipython并使用标签完成:-)


unu*_*tbu 5

获取类层次结构的另一种方法是访问mro属性:

class A(object):
    pass
class B(A):
    pass
instance = B()
print(instance.__class__.__mro__)
# (<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
Run Code Online (Sandbox Code Playgroud)

请注意,在 Python 2.x 中,您必须使用“新式”对象以确保它们具有 mro属性。你可以通过声明来做到这一点

class A(object):
Run Code Online (Sandbox Code Playgroud)

代替

class A():
Run Code Online (Sandbox Code Playgroud)

有关新样式对象和 mro(方法解析顺序)的更多信息,请参阅http://www.python.org/doc/newstyle/http://www.python.org/download/releases/2.3/mro/ 。

在Python 3.x中,所有对象都是新式对象,因此您可以使用mro并简单地以这种方式声明对象:

class A():
Run Code Online (Sandbox Code Playgroud)