You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:54:03