首页 > 解决方案 > 在 Python OOP 实现类中需要帮助

问题描述

我需要这里的每个人都建议指导我,我正在尝试 Python OOP 中的一个类,这是我下面的代码。我已经导入 abstractmethod 但不确定为什么下面有错误。我不明白如何解决这个问题。任何人都可以帮助我吗?

from abc import ABC, abstractmethod

class Employee(ABC):
    def __init__(self, employeeId, name, workFromHome, leaveBalance = 0):
        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
    
    #Other Methods
    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, 'Yes')
    print(e1)

    
main()

遇到的错误:

40 41 ---> 42 main() 中的 TypeError Traceback (最近一次调用最后一次)

在 main() 36 def main(): 37 ---> 38 e1 = Employee('101', 'Jeff', 20, 'Yes') 39 print(e1) 40

TypeError:无法使用抽象方法 getLeaveEntitlement 实例化抽象类 Employee

如果工作这是结果: ID:101 姓名:Jeff Leave 余额:20 WFH:否

标签: python-3.x

解决方案


由于 Employee 是一个 ABC,你不能直接实例化它。只有 1) 继承自它和 2) 实现其抽象方法的类才允许被实例化。您的代码没有任何“错误”,这是一个设计约束。

以下代码添加了EmployeeChildClass继承自Employee并按您预期工作的代码:

from abc import ABC, abstractmethod

class Employee(ABC):
    def __init__(self, employeeId, name, workFromHome, leaveBalance = 0):
        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
    
    #Other Methods
    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}'


# Dummy implementation
class EmployeeChildClass(Employee):
    def getLeaveEntitlement(self):
        return None


def main():
    
    e1 = EmployeeChildClass('101', 'Jeff', 20, 'Yes')
    print(e1)

    
main()

推荐阅读