Python OOP实现Employee抽象类实例化报错求助
问题原因
- 核心错误1:你定义的
Employee类继承了ABC类,且内部有被@abstractmethod装饰的抽象方法getLeaveEntitlement,这类抽象类本身就不允许直接实例化,必须先定义子类继承Employee,并在子类中实现所有抽象方法后,才能实例化子类对象。 - 错误2:实例化时传参顺序和
__init__定义的参数顺序不匹配:__init__的参数顺序是(employeeId, name, workFromHome, leaveBalance = 0),你传入的('101', 'Jeff', 20, 'Yes')会把数值20赋值给workFromHome,字符串Yes赋值给leaveBalance,和预期的属性赋值完全错位。 - 错误3:
__str__方法的输出格式和你预期的不一致,缺少ID后的冒号,另外如果需要输出WFH为No,对应传参也要调整。
解决方法
方案1:不需要使用抽象类的场景(直接修改原有Employee类)
直接移除抽象类相关的定义即可,修改后代码如下:
class Employee: def __init__(self, employeeId, name, leaveBalance = 0, workFromHome = 'No'): self._employeeId = employeeId self._name = name self._workFromHome = workFromHome self._leaveBalance = leaveBalance @property def employeeId(self): return self._employeeId @property def name(self): return self._name @property def workFromHome(self): return self._workFromHome @workFromHome.setter def workFromHome(self, atHome): self._workFromHome = atHome def getLeaveEntitlement(self): # 此处补充对应业务逻辑即可 pass def adjustLeave(self, adjustment): self._leaveBalance += adjustment def __str__(self): # 修改输出格式匹配预期 return f'ID: {self._employeeId} Name: {self._name} Leave Balance: {self._leaveBalance} WFH: {self._workFromHome}' def main(): # 调整传参顺序匹配参数定义 e1 = Employee('101', 'Jeff', 20, 'No') print(e1) main()
运行后输出:ID: 101 Name: Jeff Leave Balance: 20 WFH: No
方案2:需要保留抽象类作为基类的场景
先定义子类继承抽象基类Employee,实现抽象方法后实例化子类,代码示例如下:
from abc import ABC, abstractmethod class Employee(ABC): def __init__(self, employeeId, name, leaveBalance = 0, workFromHome = 'No'): self._employeeId = employeeId self._name = name self._workFromHome = workFromHome self._leaveBalance = leaveBalance @property def employeeId(self): return self._employeeId @property def name(self): return self._name @property def workFromHome(self): return self._workFromHome @workFromHome.setter def workFromHome(self, atHome): self._workFromHome = atHome @abstractmethod def getLeaveEntitlement(self): pass def adjustLeave(self, adjustment): self._leaveBalance += adjustment def __str__(self): return f'ID: {self._employeeId} Name: {self._name} Leave Balance: {self._leaveBalance} WFH: {self._workFromHome}' # 定义子类继承Employee,实现抽象方法 class FullTimeEmployee(Employee): def getLeaveEntitlement(self): # 示例为全职员工的年假逻辑,可根据需求调整 return 15 def main(): e1 = FullTimeEmployee('101', 'Jeff', 20, 'No') print(e1) main()
运行后输出和预期完全一致。
内容的提问来源于stack exchange,提问作者Petee
相关产品推荐
相关产品推荐

