繁体   English   中英

构造函数的钻石问题 - Python

[英]Diamond problem with constructor - Python

我对 WorkingStudent class 的构造函数有疑问:

class Person:
    def __init__ (self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName

class Student(Person):
    def __init__(self, firstName, lastName, Id, grades):
        super().__init__(firstName, lastName)
        self.Id = Id
        self.grades = grades

class Worker(Person):
    def __init__(self, firstName, lastName, title, salary):
        super().__init__(firstName, lastName)
        self.title = title
        self.salary = salary

class WorkingStudent(Student, Worker):
    def __init__(self, firstName, lastName, Id, grades, title, salary):
        Student.__init__(self, firstName, lastName, Id, grades)
        Worker.__init__(self, firstName, lastName, title, salary)


ws = Worker("Tony", "Soprano", 123, "F")
ws.title="worker"
ws.salary=2400

当我尝试以这种方式创建 class object 时:

ws = Worker("Tony", "Soprano", 123, "F", "worker", 2400)

我收到错误:

TypeError: __init__() takes 5 positional arguments but 7 were given

我应该如何创建 WorkingStudent class 的构造函数?

似乎您正在尝试通过初始化“工人”class 实例来创建“工作学生”?

worker class 需要 5 arguments(包括self参数),而 workingstudent class 需要 7。你现在给self + 6 arguments 给 Worker class ...

尝试改变

ws = Worker("Tony", "Soprano", 123, "F", "worker", 2400)

ws = WorkingStudent("Tony", "Soprano", 123, "F", "worker", 2400)

==编辑==

请参阅https://stackoverflow.com/a/46200507/7549479

class 签名应该是一致的,所以你可以使用**kwargs让每个 class 接受(忽略)关键字 arguments。

不完美,但它有效:

class Person:
    def __init__ (self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName

class Student(Person):
    def __init__(self, Id, grades, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.Id = Id
        self.grades = grades

class Worker(Person):
    def __init__(self, title, salary, *args, **kwargs):
        super().__init__(*args, *kwargs)
        self.title = title
        self.salary = salary

class WorkingStudent(Student, Worker):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

ws = WorkingStudent(123, "F", "title", 2400, "Tony", "Soprano")

ws2 = WorkingStudent(firstName="Tony", lastName="Soprano", Id="123", title="worker", salary=2400, grades="F")

ws中我需要按这个顺序给出arguments! -> 它有效

ws2打印firstNamelastName给出 'firstName' 和 'lastName' 而不是 'Tony' 和 'Soprano'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM