- 面向对象的3大特征 封装【分】 继承【隔】 多态【做】
- 6大设计原则
1、开闭原则 【总的指导思想】
原理:对扩展开放,对修改关闭
说明:增加新功能,不能修改原有代码
实例:一个软件通过灵活的扩展来实现未来的变化,实现软件的复用、易于扩展
2、依赖倒置 【继承的补充】
原理:尽量依赖抽象(抽象不应该依赖细节,细节应该依赖抽象)
说明:调用的类尽量使用抽象
本质:通过抽象使各个类的实现彼此独立,互不影响,减少模块之间的依赖
3、单一职责 【一个类的定义】
原理:一个类有且只有一个改变它的原因。
说明:一个类只负责一项职能(操作)
4、组合复用 【复用的最佳实践】
原理:如果仅仅为了代码复用选择组合复用,而非继承
代码复用:继承、组合
语义: 是1种 有1种
说明:通过变量调用对象的方法
5、迪米特法则 【类与类交互】
原理:类与类之间交互时,在满足功能需求的基础上
传递的数据越少越好【降低耦合度】
说明:一个对象应该对其他的对对象有更少的了解,只需要提供公开的方法
两个对象不必直接通信(通过第3个对象转发)
6、里氏替换 【继承后的重写】
原理:父类出现的地方可以被子类替换(在替换后保持原有功能)
子类在重写父类方法时尽量选择扩展重写
'''
创建一个员工管理类
1、存储员工对象
2、计算总薪资
员工:
1、程序猿: 底薪 + 项目分红
2、测试员: 底薪 + bug数 × 10
要求:
增加新的员工对象,不要改变原有代码
思考:
哪些地方体现了6大设计原则
'''
class EmployeeManager:
def __init__(self):
self.list_employ = []
def add_employ(self, employ):
if isinstance(employ, Employee):
self.list_employ.append(employ)
def calculate_salary(self):
total_salary = 0
for item in self.list_employ:
total_salary += item.cal_salary()
return total_salary
class Employee:
def __init__(self, bsalary):
self.salary_base = bsalary
def cal_salary(self):
return self.salary_base
class Programmer(Employee):
def __init__(self, bsalary, bonus):
super().__init__(bsalary)
self.bonus = bonus
def cal_salary(self):
return super().cal_salary() + self.bonus
class Tester(Employee):
def __init__(self, bsalary, bug_count):
super().__init__(bsalary)
self.bug_count = bug_count
def cal_salary(self):
return super().cal_salary() + self.bug_count * 10
employ = EmployeeManager()
p01 = Programmer(12000, 20000)
t01 = Tester(10000, 1200)
employ.add_employ(p01)
employ.add_employ(t01)
print(employ.calculate_salary())