[英]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
打印firstName
和lastName
给出 'firstName' 和 'lastName' 而不是 'Tony' 和 'Soprano'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.