【发布时间】:2018-05-01 20:19:19
【问题描述】:
Person.py
class Person:
def __init__(self, pname):
self.name = pname
@classmethod
def parse(cls, name):
return cls(name)
Employee.py
class Employee(Person):
def __init__(self, ename, esalary):
super().__init__(ename)
self.salary = esalary
@classmethod
def parse(cls, data):
person = super().parse(data["name"])
person.salary = data["salary"]
return person
Customer.py
class Customer(Person):
def __init__(self, ename, country):
super().__init__(ename)
self.country = country
@classmethod
def parse(cls, data):
person = super().parse(data["name"])
person.country = data["country"]
return person
main.py
emp_data = {
"name": "john",
"salary": 1000
}
emp = Employee.parse(emp_data)
print(type(emp))
print(emp.name)
print(emp.salary)
cust_data = {
"name": "peter",
"country": "USA"
}
cust = Customer.parse(cust_data)
print(type(cust))
print(cust.name)
print(cust.country)
错误
TypeError Traceback (most recent call last)
<ipython-input-32-a5abd51d9870> in <module>()
36 "salary": 1000
37 }
---> 38 emp = Employee.parse(emp_data)
39 print(type(emp))
40 print(emp.name)
<ipython-input-32-a5abd51d9870> in parse(cls, data)
14 @classmethod
15 def parse(cls, data):
---> 16 person = super().parse(data["name"])
17 person.salary = data["salary"]
18 return person
<ipython-input-32-a5abd51d9870> in parse(cls, name)
5 @classmethod
6 def parse(cls, name):
----> 7 return cls(name)
8
9 class Employee(Person):
TypeError: __init__() missing 1 required positional argument: 'esalary'
此示例仅用于在实际代码中重现问题。实际的解析函数涉及复杂的逻辑。
在上面的示例中,Employee 和 Customer 类扩展了 Person 类。根据错误,Person 类的init 方法由同一类的parse 调用,期待esalary。但是Person init 方法上没有esalary 属性。
我的程序有什么问题?我想我没有正确理解继承。请纠正我。首先,我的程序结构是否正确?
【问题讨论】:
-
cls将是Employee而不是Person -
为什么?你能解释一下吗?
-
@What 第一个参数是什么?
-
@LokeshCherukuri 我不是 100% 确定这就是我删除评论的原因,但通常对象的每个第一个参数都指向 self。所以当你传递 cust_data 时,实际上你只传递给 self。但是我不知道边缘情况。
标签: python inheritance