Python多继承带参数出现异常

1在学习python多继承过程中出现了一个异常,实在是搞不清楚问题出在哪里,求大神解答

class People(object):
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex
class Teacher(People):
    def __init__(self, name, sex, student):
        super(Teacher, self).__init__(name, sex)
        self.student=student
class Father(People):
    def __init__(self,name,sex,child):
        super(Father,self).__init__(name,sex)
        self.child=child
class Disen(Father,Teacher):
    def __init__(self,name,sex,child,student):
        super(Disen,self).__init__(name,sex,child)
        super(Disen,self).__init__(name,sex,student)
print(Disen.__mro__)
disen=Disen('disen_','male','judy','student1')

异常代码
F:MypythonProjectvenvScriptspython.exe F:/MypythonProject/my_file.py F:/
(<class '__main__.Disen'>, <class '__main__.Father'>, <class '__main__.Teacher'>, <class '__main__.People'>, <class 'object'>)
Traceback (most recent call last):
File "F:/MypythonProject/my_file.py", line 185, in <module>

disen=Disen('disen_','male','judy','student1')

File "F:/MypythonProject/my_file.py", line 182, in init

super(Disen,self).__init__(name,sex,child)

File "F:/MypythonProject/my_file.py", line 178, in init

super(Father,self).__init__(name,sex)

TypeError: __init__() missing 1 required positional argument: 'student'
问题:
1在调试过程中,Disen类实例执行构造函数时首先调用了Father类的构造函数,但是错误提示Father类缺少一个student属性,这个属性是定义在Teacher类中,实在搞不清楚,这个应该是我对钻石继承理解不了,希望大神能够结合我的错误讲解一下钻石继承的概念,谢谢

阅读 3k
1 个回答

首先应该避免多重继承、多级继承,不然代码质量大打折扣了。不妨了解一下 组件化编程接口编程 相关知识。

在这个例子中,你可以显式调用父类的 __init__() 方法,代替 super() ,如下

# -*- coding: utf-8 -*-
class People(object):
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


class Teacher(People):
    def __init__(self, name, sex, student):
        People.__init__(self, name, sex)
        self.student = student


class Father(People):
    def __init__(self, name, sex, child):
        People.__init__(self, name, sex)
        self.child = child


class Disen(Father, Teacher):
    def __init__(self, name, sex, child, student):
        Father.__init__(self, name, sex, child)
        Teacher.__init__(self, name, sex, student)


def test_class():
    # 使用 pytest 测试
    disen = Disen('李毅', '男', 'judy', 'student1')
    assert disen.name == '李毅'
    assert disen.sex == '男'
    assert disen.child == 'judy'
    assert disen.student == 'student1'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题