如何在Python的Test类中获取传入的Art类的父类?
获取传入类的所有父类的解决方案
嘿,我来帮你搞定这个问题!你想要在Test类内部拿到传入的Art类的所有父类(也就是Artists和Base),其实不用纠结super()——它主要是用来在类方法里调用父类的方法,针对的是当前类或实例的继承链,而我们这里要处理的是传入的另一个独立类,用Python内置的类属性就能轻松解决。
直接修改后的代码实现
这里给你两种可行的方案,你可以根据需求选:
方案1:递归收集所有层级的父类(包括间接继承的)
这种方式会把所有父类(比如Art的直接父类Artists,以及Artists的父类Base)都收集起来:
# 先定义好继承链的类 class Base: pass class Artists(Base): pass class Art(Artists): pass class Test(object): def __init__(self, name, myclass): self.name = name self.myclass = myclass def get_parents(self): all_parents = [] # 递归函数,遍历每个类的父类 def collect_parent_classes(cls): # 遍历当前类的直接父类 for base_cls in cls.__bases__: # 排除默认的object类(如果需要保留可以去掉这个判断) if base_cls is not object: all_parents.append(base_cls) # 继续递归收集父类的父类 collect_parent_classes(base_cls) collect_parent_classes(self.myclass) return all_parents # 测试代码 testobj = Test('testA', Art) print(testobj.get_parents()) # 输出结果:[<class '__main__.Artists'>, <class '__main__.Base'>]
方案2:用__mro__快速获取所有父类
Python的每个类都有__mro__属性,它返回类的方法解析顺序元组,包含了从自身到最顶层父类的所有类。我们只要过滤掉自身和默认的object类就能得到所有父类:
class Test(object): def __init__(self, name, myclass): self.name = name self.myclass = myclass def get_parents(self): # 从MRO里过滤掉自身和object,剩下的就是所有父类 return [cls for cls in self.myclass.__mro__ if cls not in (self.myclass, object)] # 测试后同样会输出:[<class '__main__.Artists'>, <class '__main__.Base'>]
关键知识点说明
__bases__:每个类的这个属性会返回一个元组,包含该类直接继承的父类。比如Art.__bases__的结果是(<class '__main__.Artists'>,),Artists.__bases__是(<class '__main__.Base'>,)。__mro__:全称是Method Resolution Order,它是Python用来查找方法的顺序链,包含了类本身、所有父类直到object。用它可以一次性拿到所有层级的继承关系,非常方便。- 为什么不用
super():super()的作用是在类的方法中调用父类的方法,它依赖于当前类的上下文和实例的MRO,并不适合直接获取另一个类的父类结构,所以这里用类的内置属性是更直接的方式。
内容的提问来源于stack exchange,提问作者1010101
相关产品推荐
相关产品推荐

