本文档展示了 Python 面向对象编程的核心概念,通过 Person 类及其子类的实例深入理解继承、关联和依赖关系。
📚 核心概念
🔒 slots 魔法属性
如果要限制一个类的对象只能拥有特定属性,可以在类中使用 __slots__ 魔法属性:
classPerson: __slots__ = ('name', 'age') # 限制对象只能有 name 和 age 属性
🧬 继承 (Inheritance)
对已有的类进行扩展创建出新类,这个过程就叫继承。
子类直接从父类继承公共的属性和行为,再添加自己特有的属性和行为。
🔗 类之间的关系
📋 is-a 关系:继承
从一个类派生出另一个类,表示 "是一个" 的关系:
Person --> Student Person --> Teacher
🗂️ has-a 关系:关联
把一个类的对象作为另外一个类的对象的属性,表示 "拥有" 的关系:
Student -- 拥有 --> Computer Person -- 拥有 --> 身份证 Car -- 拥有 --> 引擎
- a person has an identity card
⚙️ use-a 关系:依赖
一个类对象作为另外一个类的方法参数或者返回值,表示 "使用" 的关系:
🧩 多重继承
Python 中的继承允许多重继承,一个类可以有多个父类。
🏗️ 类结构
📦 Computer 类
classComputer:pass
空类,用于演示关联关系
👤 Person 类 (基类)
classPerson:""" 人类基类 """def__init__(self, name, age, gender): self.name = name # 姓名 self.age = age # 年龄 self.gender = gender # 性别 (True=男, False=女)defeat(self):""" 吃饭 """ print(f'{self.name}正在吃饭.')defspeak(self):""" 显示年龄 """ print(f'{self.name}今年的岁数:{self.age}')defintroduce(self):""" 自我介绍 """ sex = "男"if self.gender else"女" print(f'我叫{self.name},性别:{sex},今年{self.age}岁')
基类,包含 name、age、gender 属性和 eat、speak、introduce 方法
👨🏫 Teacher 类
classTeacher(Person):""" 教师类 """def__init__(self, name, age, gender, title): super().__init__(name, age, gender) self.title = title # 职称defteach(self, course_name):""" 授课 """ print(f'{self.name}{self.title}正在教魔兽王学习[{course_name}]课程')
👨🎓 Student 类
classStudent(Person):""" 学生类 """def__init__(self, name, age, gender, grade): super().__init__(name, age, gender) self.grade = grade # 年级# 学生与电脑是关联关系可以有多个,也可以是单个 self.computers = [Computer(), Computer()]defstudy(self, course_name):""" 学习 """ print(f'{self.name}正在学习{course_name}')
💻 使用示例
🎓 创建学生对象
# 实例化学生对象stu = Student("王小婷", 16, False, "初二")# 调用继承自父类的方法stu.introduce() # 输出: 我叫王小婷,性别:女,今年16岁stu.eat() # 输出: 王小婷正在吃饭.stu.speak() # 输出: 王小婷今年的岁数:16# 调用子类特有方法stu.study("数学") # 输出: 王小婷正在学习数学
👨🏫 创建教师对象
# 实例化教师对象teach = Teacher("王伯", 56, True, "教授")# 调用继承自父类的方法teach.introduce() # 输出: 我叫王伯,性别:男,今年56岁teach.eat() # 输出: 王伯正在吃饭.teach.speak() # 输出: 王伯今年的岁数:56# 调用子类特有方法teach.teach("动力学") # 输出: 王伯教授正在教魔兽王学习[动力学]课程
关键关系说明
- 🧬 继承关系:
Teacher 和 Student 都继承自 Person,复用了父类的属性和方法 - 🗂️ 关联关系:
Student 类中包含 computers 列表,演示 has-a 关系
🎯 员工薪资结算系统
核心概念
以下面向对象编程概念:
| | |
|---|
| | |
| | calculate_salary 方法在不同子类中有不同计算逻辑 |
| | 基类中的 calculate_salary 抽象方法 |
| | SalaryCalculator 封装员工管理和薪资计算逻辑 |
🏗️ 类结构
📋 Employee 类 (抽象基类)
classEmployee:""" 员工基类 """def__init__(self, name, employee_id): self.name = name # 员工姓名 self.employee_id = employee_id # 员工编号defcalculate_salary(self):""" 计算月薪(子类需重写) """raise NotImplementedError("子类必须实现 calculate_salary 方法")defintroduce(self):""" 自我介绍 """ print(f"员工编号:{self.employee_id},姓名:{self.name}")
👔 FullTimeEmployee 类 (全职员工)
classFullTimeEmployee(Employee):""" 全职员工:固定月薪 """def__init__(self, name, employee_id, monthly_salary): super().__init__(name, employee_id) self.monthly_salary = monthly_salary # 月薪defcalculate_salary(self):return self.monthly_salary
| | |
|---|
| Employee → FullTimeEmployee | | |
⏱️ PartTimeEmployee 类 (兼职员工)
classPartTimeEmployee(Employee):""" 兼职员工:按时薪和工作时长计算 """def__init__(self, name, employee_id, hourly_rate, work_hours): super().__init__(name, employee_id) self.hourly_rate = hourly_rate # 时薪 self.work_hours = work_hours # 工作时长defcalculate_salary(self):return self.hourly_rate * self.work_hours
| | |
|---|
| Employee → PartTimeEmployee | | |
💰 SalesEmployee 类 (销售员工)
classSalesEmployee(Employee):""" 销售员工:底薪 + 提成 """def__init__(self, name, employee_id, base_salary, sales_amount, commission_rate): super().__init__(name, employee_id) self.base_salary = base_salary # 底薪 self.sales_amount = sales_amount # 销售额 self.commission_rate = commission_rate # 提成比例defcalculate_salary(self): commission = self.sales_amount * self.commission_ratereturn self.base_salary + commission
| | |
|---|
| base_salary, sales_amount, commission_rate | |
🧮 SalaryCalculator 类 (薪资计算器)
classSalaryCalculator:""" 薪资计算器:统一管理员工薪资结算 """def__init__(self): self.employees = [] # 员工列表defadd_employee(self, employee):""" 添加员工 """ self.employees.append(employee)defcalculate_all(self):""" 计算所有员工薪资 """ total = 0 print("=" * 40) print("员工薪资结算单") print("=" * 40)for emp in self.employees: salary = emp.calculate_salary() total += salary emp.introduce() print(f"本月薪资:{salary:.2f} 元") print("-" * 40) print(f"薪资总计:{total:.2f} 元") print("=" * 40)return total
💻 使用示例
📝 创建和计算薪资
if __name__ == "__main__":# 创建薪资计算器 calculator = SalaryCalculator()# 添加不同类型的员工 calculator.add_employee(FullTimeEmployee("张三", "FT001", 15000)) calculator.add_employee(FullTimeEmployee("李四", "FT002", 12000)) calculator.add_employee(PartTimeEmployee("王五", "PT001", 50, 80)) calculator.add_employee(PartTimeEmployee("赵六", "PT002", 60, 60)) calculator.add_employee(SalesEmployee("钱七", "SL001", 8000, 50000, 0.05)) calculator.add_employee(SalesEmployee("孙八", "SL002", 6000, 80000, 0.08))# 结算薪资 calculator.calculate_all()
🖥️ 输出结果
========================================员工薪资结算单========================================员工编号:FT001,姓名:张三本月薪资:15000.00 元----------------------------------------员工编号:FT002,姓名:李四本月薪资:12000.00 元----------------------------------------员工编号:PT001,姓名:王五本月薪资:4000.00 元----------------------------------------员工编号:PT002,姓名:赵六本月薪资:3600.00 元----------------------------------------员工编号:SL001,姓名:钱七本月薪资:10500.00 元----------------------------------------员工编号:SL002,姓名:孙八本月薪资:12400.00 元----------------------------------------薪资总计:57500.00 元========================================
🔍 多态实现原理
graph TD A[SalaryCalculator.calculate_all] --> B[遍历员工列表] B --> C[调用每个员工的 calculate_salary] C --> D{员工类型} D --> |FullTimeEmployee| E[返回固定月薪] D --> |PartTimeEmployee| F[返回时薪 × 工作时长] D --> |SalesEmployee| G[返回底薪 + 销售额 × 提成] E --> H[累加到总薪资] F --> H G --> H H --> I[输出结果]
多态的优势
- 扩展性:新增员工类型只需继承 Employee 并实现 calculate_salary
- 统一接口:所有员工对象都响应相同的 calculate_salary 调用
📈 薪资计算公式
| | |
|---|
| 薪资 = monthly_salary | |
| 薪资 = hourly_rate × work_hours | hourly_rate: 时薪, work_hours: 工作时长 |
| 薪资 = base_salary + sales_amount × commission_rate | base_salary: 底薪, sales_amount: 销售额, commission_rate: 提成比例 |