Aym*_*ieh 208
使用以下属性:
cls.__bases__
Run Code Online (Sandbox Code Playgroud)
来自文档:
类对象的基类的元组.
例:
>>> str.__bases__
(<type 'basestring'>,)
Run Code Online (Sandbox Code Playgroud)
另一个例子:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 98
如果你想要所有的祖先而不是直接的祖先,请使用inspect.getmro:
import inspect
print inspect.getmro(cls)
Run Code Online (Sandbox Code Playgroud)
有用的是,这为您提供了"方法解析顺序"中的所有祖先类 - 即解析方法时检查祖先的顺序(或实际上,任何其他属性 - 方法和其他属性存在于同一名称空间中)毕竟在Python中;-).
Pas*_*ten 12
如果您只想获取父项,请使用基数,使用__mro__(如@naught101 所指出的)获取方法解析顺序(以便了解 init 的执行顺序)。
基础(并首先获取现有对象的类):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
Run Code Online (Sandbox Code Playgroud)
对于最近 Python 版本中的 mro:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
Run Code Online (Sandbox Code Playgroud)
显然,当您已经有了类定义时,您可以直接调用__mro__它:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
Run Code Online (Sandbox Code Playgroud)
以最快的方式查看所有父母,然后按顺序使用内置__mro__
即 repr(YOUR_CLASS.__mro__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
Run Code Online (Sandbox Code Playgroud)
输出,IN ORDER
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
Run Code Online (Sandbox Code Playgroud)
你有它。目前“最佳”的答案是182票(我在输入时),但是这比一些复杂的for循环要简单得多,一次查看一个基类,更不用说当一个类扩展两个或两个以上父级时类。导入和使用inspect仅会不必要地覆盖范围。老实说,人们不知道仅使用内置功能是一种耻辱
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
81733 次 |
| 最近记录: |