Python多继承问题:无法访问第二个父类的属性与方法求助
解决Python多继承中无法访问第二个父类属性的问题
你的问题出在多继承时仅调用了第一个父类的构造方法,导致第二个父类的属性没有被初始化。
问题原因
在Python中,super().__init__()会按照类的MRO(方法解析顺序)调用父类构造方法。对于Student(Person1, Person2),它的MRO顺序是Student → Person1 → Person2 → object。但你的Person1类的__init__没有调用super().__init__(),所以Person2的__init__不会被自动执行,对应的属性自然无法访问。
解决方案:显式调用所有父类的构造方法
直接在子类的__init__中分别调用每个父类的构造方法并传入self参数,确保所有父类的属性都被初始化:
class Person1: def __init__(self) -> None: self.john_name = "John" self.john_age = 36 def get_name_john(self) -> str: return self.john_name def get_age_john(self) -> int: return self.john_age class Person2: def __init__(self) -> None: self.ted_name = "Ted" self.ted_age = 32 def get_name_ted(self) -> str: return self.ted_name def get_age_ted(self) -> int: return self.ted_age class Student(Person1, Person2): def __init__(self) -> None: # 显式调用每个父类的构造方法 Person1.__init__(self) Person2.__init__(self) print(self.john_age) print(self.ted_age) print(self.get_name_john()) print(self.get_name_ted()) print(self.get_age_john()) print(self.get_age_ted()) student = Student()
运行这段代码后,就能正常访问两个父类的所有属性和方法。
补充:协作式多继承写法(可选)
如果希望用super()实现规范的多继承协作,需要让所有父类的__init__都调用super(),这样MRO链上的所有构造方法都会被依次执行:
class Person1: def __init__(self) -> None: super().__init__() self.john_name = "John" self.john_age = 36 # 方法省略... class Person2: def __init__(self) -> None: super().__init__() self.ted_name = "Ted" self.ted_age = 32 # 方法省略... class Student(Person1, Person2): def __init__(self) -> None: super().__init__() # 按MRO依次调用Person1、Person2的__init__ # 后续print代码不变
这种写法更符合Python新式类的多继承规范,但需要所有父类都遵循协作调用的约定。
内容的提问来源于stack exchange,提问作者Antonio Costa
相关产品推荐
相关产品推荐

