Python 创建一个 Employee 类,包含工号、姓名、薪水等属性,并实现工号查询功能(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Python 开发中,面向对象编程(OOP)是解决实际问题的重要工具。今天我们将围绕一个具体场景——“Python 创建一个 Employee 类,包含工号、姓名、薪水等属性,并实现工号查询功能”,逐步讲解如何通过类与对象构建业务模型,并实现核心功能。无论是编程新手还是有一定基础的开发者,都能通过本文掌握类的基础知识、属性与方法的使用逻辑,以及如何通过代码实现高效的数据查询。


类的基础知识:什么是类与对象?

类的定义与实例化

在 Python 中,类(Class) 是一种用户自定义的数据类型,可以看作是“蓝图”或“模板”,用于描述某一类对象的共同特征和行为。例如,员工(Employee)类可以定义所有员工共有的属性(如工号、姓名、薪水)和方法(如显示信息、计算奖金)。

对象(Object) 是类的具体实例。例如,创建一个名为 emp_001 的对象,它继承自 Employee 类的所有属性和方法。

代码示例:定义一个简单的 Employee 类

class Employee:  
    def __init__(self, id_number, name, salary):  
        self.id_number = id_number  
        self.name = name  
        self.salary = salary  

    def display_info(self):  
        print(f"工号:{self.id_number}, 姓名:{self.name}, 薪水:{self.salary} 元/月")  

属性与方法的区别

  • 属性(Attribute):描述对象的状态,例如 id_numbernamesalary
  • 方法(Method):描述对象的行为,例如 display_info() 方法用于展示员工信息。

属性的定义与初始化

__init__ 方法:对象的初始化

在 Python 中,__init__ 方法是类的构造函数,用于在创建对象时初始化其属性。通过 self 参数,我们可以将传入的参数绑定到对象的属性上。

代码示例:初始化员工对象

emp_001 = Employee("E001", "张三", 15000)  
emp_002 = Employee("E002", "李四", 18000)  

类属性与实例属性的区别

  • 实例属性:通过 self 绑定的属性(如 self.id_number),每个对象独立拥有。
  • 类属性:直接定义在类中的属性,所有实例共享。例如,可以定义一个 total_employees 类属性来统计员工总数。

代码示例:添加类属性

class Employee:  
    total_employees = 0  # 类属性,统计员工总数  

    def __init__(self, id_number, name, salary):  
        self.id_number = id_number  
        self.name = name  
        self.salary = salary  
        Employee.total_employees += 1  # 每创建一个实例,总数加 1  

方法的实现:封装业务逻辑

方法的定义与调用

方法是类中定义的函数,通过 self 参数访问对象的属性。例如,display_info() 方法通过 self 获取当前对象的 id_numbernamesalary

代码示例:调用方法展示员工信息

emp_001.display_info()  # 输出:工号:E001, 姓名:张三, 薪水:15000 元/月  

魔术方法:让对象更易用

Python 提供了大量魔术方法(以双下划线开头和结尾),例如 __str__() 方法可以定义对象的字符串表示形式。

代码示例:重写 __str__ 方法

class Employee:  
    ...  

    def __str__(self):  
        return f"员工信息:{self.id_number} - {self.name}(月薪 {self.salary} 元)"  

print(emp_001)  # 输出:员工信息:E001 - 张三(月薪 15000 元)  

工号查询功能的实现

数据存储:使用列表或字典管理员工信息

要实现工号查询,需要将所有员工对象存储在一个集合中。通常有两种方式:

  1. 列表(List):按顺序存储对象,适合小规模数据。
  2. 字典(Dictionary):以工号为键,对象为值,支持快速查询。

方案一:使用列表存储

employees = []  
employees.append(Employee("E001", "张三", 15000))  
employees.append(Employee("E002", "李四", 18000))  

for emp in employees:  
    if emp.id_number == "E001":  
        print(emp)  
        break  
else:  
    print("未找到该员工!")  

方案二:使用字典存储(推荐)

employee_dict = {}  
employee_dict["E001"] = Employee("E001", "张三", 15000)  
employee_dict["E002"] = Employee("E002", "李四", 18000)  

target_id = "E001"  
emp = employee_dict.get(target_id)  
if emp:  
    print(emp)  
else:  
    print("未找到该员工!")  

性能对比

  • 列表查询时间复杂度为 O(n),字典为 O(1)。因此,对于大规模数据,字典是更优选择。

封装查询功能到类中

类方法与静态方法

为了提升代码复用性,可以将查询逻辑封装到 Employee 类中。

代码示例:添加查询方法

class Employee:  
    ...  # 其他属性与方法  

    # 使用类方法管理员工字典  
    _employee_dict = {}  # 类属性,存储所有员工  

    @classmethod  
    def add_employee(cls, id_number, name, salary):  
        new_emp = cls(id_number, name, salary)  
        cls._employee_dict[id_number] = new_emp  

    @classmethod  
    def query_by_id(cls, target_id):  
        return cls._employee_dict.get(target_id, "未找到该员工!")  

使用封装后的类方法

Employee.add_employee("E001", "张三", 15000)  
Employee.add_employee("E002", "李四", 18000)  

result = Employee.query_by_id("E001")  
print(result)  # 输出员工信息  

result = Employee.query_by_id("E999")  
print(result)  # 输出“未找到该员工!”  

代码优化与错误处理

处理工号重复问题

在添加员工时,需检查工号是否已存在,避免重复。

代码示例:添加重复检测逻辑

class Employee:  
    ...  

    @classmethod  
    def add_employee(cls, id_number, name, salary):  
        if id_number in cls._employee_dict:  
            print(f"错误:工号 {id_number} 已存在!")  
            return  
        new_emp = cls(id_number, name, salary)  
        cls._employee_dict[id_number] = new_emp  

异常处理:捕获无效输入

在查询工号时,可以捕获输入错误或无效格式。

代码示例:使用 try-except 处理异常

def main():  
    while True:  
        try:  
            user_input = input("请输入要查询的工号(输入 q 退出):")  
            if user_input == "q":  
                break  
            result = Employee.query_by_id(user_input)  
            print(result)  
        except Exception as e:  
            print(f"发生错误:{str(e)}")  

if __name__ == "__main__":  
    main()  

完整代码与扩展思考

完整代码示例

class Employee:  
    _employee_dict = {}  
    total_employees = 0  

    def __init__(self, id_number, name, salary):  
        self.id_number = id_number  
        self.name = name  
        self.salary = salary  
        Employee.total_employees += 1  

    def __str__(self):  
        return f"员工信息:{self.id_number} - {self.name}(月薪 {self.salary} 元)"  

    @classmethod  
    def add_employee(cls, id_number, name, salary):  
        if id_number in cls._employee_dict:  
            print(f"错误:工号 {id_number} 已存在!")  
            return  
        new_emp = cls(id_number, name, salary)  
        cls._employee_dict[id_number] = new_emp  

    @classmethod  
    def query_by_id(cls, target_id):  
        return cls._employee_dict.get(target_id, "未找到该员工!")  

if __name__ == "__main__":  
    Employee.add_employee("E001", "张三", 15000)  
    Employee.add_employee("E002", "李四", 18000)  

    # 测试查询  
    print(Employee.query_by_id("E001"))  
    print(Employee.query_by_id("E999"))  

扩展方向

  1. 继承与多态:创建 ManagerEngineer 子类,继承 Employee 并添加专属属性(如 bonus)。
  2. 数据持久化:将员工信息保存到文件或数据库中。
  3. 复杂查询:实现按姓名、部门等条件筛选员工。

结论

通过本文的讲解,我们实现了从零开始构建一个 Employee 类,并完成了 工号查询功能 的全流程开发。这一过程不仅覆盖了 Python 类的基础概念(如属性、方法、魔术方法),还涉及了面向对象设计的核心思想(如封装、类属性与实例属性的区别)。

对于编程初学者,建议从简单示例入手,逐步理解代码逻辑;对于中级开发者,可以尝试优化代码性能(如使用字典替代列表)或扩展功能(如数据持久化)。掌握类的设计与使用,将帮助你更高效地解决实际业务问题,并为后续学习更复杂的框架(如 Django、Flask)打下坚实基础。

希望本文能成为你 Python 学习道路上的参考指南,也期待你在实践中不断探索与创新!

最新发布