Python 创建一个 Employee 类,包含工号、姓名、薪水等属性,并实现工号查询功能(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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_number
、name
、salary
。 - 方法(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_number
、name
和 salary
。
代码示例:调用方法展示员工信息
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 元)
工号查询功能的实现
数据存储:使用列表或字典管理员工信息
要实现工号查询,需要将所有员工对象存储在一个集合中。通常有两种方式:
- 列表(List):按顺序存储对象,适合小规模数据。
- 字典(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"))
扩展方向
- 继承与多态:创建
Manager
或Engineer
子类,继承Employee
并添加专属属性(如bonus
)。 - 数据持久化:将员工信息保存到文件或数据库中。
- 复杂查询:实现按姓名、部门等条件筛选员工。
结论
通过本文的讲解,我们实现了从零开始构建一个 Employee 类,并完成了 工号查询功能 的全流程开发。这一过程不仅覆盖了 Python 类的基础概念(如属性、方法、魔术方法),还涉及了面向对象设计的核心思想(如封装、类属性与实例属性的区别)。
对于编程初学者,建议从简单示例入手,逐步理解代码逻辑;对于中级开发者,可以尝试优化代码性能(如使用字典替代列表)或扩展功能(如数据持久化)。掌握类的设计与使用,将帮助你更高效地解决实际业务问题,并为后续学习更复杂的框架(如 Django、Flask)打下坚实基础。
希望本文能成为你 Python 学习道路上的参考指南,也期待你在实践中不断探索与创新!