5

我是 python 新手,并试图获取一个对象的类继承自的类列表。我正在尝试使用该bases属性来执行此操作,但没有任何成功。有人可以帮我吗?

def foo(C):
     print(list(C.__bases__))

class Thing(object):
    def f(self):
        print("Yo")

class Shape(Thing):
    def l(self):
        print("ain't no thang")

class Circle(Shape):
    def n(self):
        print("ain't no shape")

test = Circle()
foo(test)
4

4 回答 4

6

只有类有__bases__; 类实例没有。您可以通过实例的__class__: usefoo(test.__class__)或获取类对象foo(Circle)

于 2012-09-25T02:36:27.173 回答
4

使用inspect, 来自文档

按方法解析顺序返回类 cls 的基类的元组,包括 cls。在这个元组中没有一个类不止一次出现。请注意,方法解析顺序取决于 cls 的类型。除非正在使用非常特殊的用户定义元类型,否则 cls 将是元组的第一个元素。

>>> import inspect
>>> inspect.getmro(test.__class__)
(<class '__main__.Circle'>, <class '__main__.Shape'>, <class '__main__.Thing'>, <type 'object'>)
>>> 

这将遍历继承层次结构并打印所有类,包括object. 很酷吧?

于 2012-09-25T02:36:36.007 回答
2
print '\n'.join(base.__name__ for base in test.__class__.__bases__)

或者,使用inspect模块:

from inspect import getmro
print '\n'.join(base.__name__ for base in getmro(test))
于 2012-09-25T02:40:51.217 回答
1

你实施的foo作品。但是您需要将类传递给foo,而不是实例。

In [1]: def foo(C):
   ...:          print(list(C.__bases__))
   ...:

In [2]: class Thing(object):
   ...:         def f(self):
   ...:                 print("Yo")
   ...:

In [3]: class Shape(Thing):
   ...:         def l(self):
   ...:                 print("ain't no thang")
   ...:

In [4]: class Circle(Shape):
   ...:         def n(self):
   ...:                 print("ain't no shape")
   ...:

In [5]: test = Circle()

In [6]: foo(test)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-7b85deb1beaa> in <module>()
----> 1 foo(test)

<ipython-input-1-acd1789d43a9> in foo(C)
      1 def foo(C):
----> 2          print(list(C.__bases__))
      3

AttributeError: 'Circle' object has no attribute '__bases__'

In [7]: foo(Thing)
[<type 'object'>]

In [8]: foo(Circle)
[<class '__main__.Shape'>]

In [9]: foo(Shape)
[<class '__main__.Thing'>]
于 2012-09-25T02:37:10.767 回答