如何获取Python类的父类?

q8l4jmvw  于 2023-10-14  发布在  Python
关注(0)|答案(9)|浏览(107)

如何获取Python类的父类?

mrphzbgm

mrphzbgm1#

使用以下属性:

cls.__bases__

从文档中:
类对象的基类的元组。
范例:

>>> str.__bases__
(<class 'object'>,)

另一个例子:

>>> class A(object):
...   pass
... 
>>> class B(object):
...   pass
... 
>>> class C(A, B):
...   pass
... 
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
hxzsmxv2

hxzsmxv22#

如果你想要所有的祖先,而不仅仅是直接的祖先,那么使用cls.__mro__
对于Python 3.5之前的版本,请使用inspect.getmro

import inspect
print inspect.getmro(cls)

很明显,这会按照“方法解析顺序”给出所有的祖先类--即:解析方法(或者,实际上,任何其他属性)时检查祖先的顺序--方法和其他属性毕竟在Python中位于同一个名称空间中;- ).

lxkprmvk

lxkprmvk3#

获取所有父对象的最快方法是使用__mro__内置。
例如,repr(YOUR_CLASS.__mro__)
以下:

import getpass
getpass.GetPassWarning.__mro__

.输出,顺序如下:
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>, <type 'exceptions.Warning'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)
这就对了“最佳”答案可能会有更多的投票,但这比一些复杂的for循环要简单得多,一次只查看__bases__中的一个类,更不用说当一个类扩展 * 两个 * 或更多的父类时。使用inspect只是不必要地模糊了范围。

wrrgggsh

wrrgggsh4#

新式类有一个mro方法,你可以调用它,它返回一个按方法解析顺序排列的父类列表。

gfttwv5a

gfttwv5a5#

如果你只想得到父类,使用base,使用__mro__(如@naught101所指出的)来获得方法解析顺序(以便知道init的执行顺序)。
Base(首先获取现有对象的类):

>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)

对于最近Python版本中的mro:

>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)

显然,当你已经有一个类定义时,你可以直接调用__mro__

>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
xtupzzrd

xtupzzrd6#

如果你想确保它们都被调用,那么在所有级别都使用super

daolsyd0

daolsyd07#

如果您有一个变量,并希望获取它的父类,请使用**type()**方法,该方法将为变量给予类

val="happy coding"
print(type(val).__mro__)

输出:

(<class 'str'>, <class 'object'>)
uhry853o

uhry853o8#

这个函数将打印一个对象的所有类,而在每一步中,下一个对象将是最左边的父对象。

def print_root_left(class_):
    while True:
      print(class_)
      # Check there if are no bases then we have reached the root class
      if not class_.__bases__:
        break
      class_=class_.__bases__[0] # use the left most parent

example = "hello" 
print_root_left(example.__class__)
a5g8bdjr

a5g8bdjr9#

def class_hierarchy(class_name):
    import re
    ancestor = successor = class_name
    level = 0
    print ("The", successor, "has the next parents:\n")
    while True:
        try: 
            ancestor = re.search(r"'(.*)'", str(successor.__bases__[0]))
            print (level, ancestor.group(1))
            successor = eval(ancestor.group(1))
            level+=1
        except: 
            break
#example        
class_hierarchy(IndexError)

相关问题