P149~150 Python核心-1.1&1.2 课程回顾01&02
一、Day13复习
"""
复习
面向对象:考虑问题从对象的角度出发.
抽象:从多个事物中,舍弃个别的/非本质的特征(不重要),
抽出共性的本质(重要的)过程。
三大特征:
封装:将每个变化点单独分解到不同的类中。
例如:老张开车去东北
做法:定义人类,定义车类。
继承:重用现有类的功能和概念,并在此基础上进行扩展。
统一概念
例如:图形管理器,统计圆形/矩形.....面积。
做法:用图形类代表/约束,圆形/矩形..具有计算面积的方法.
多态:调用父"抽象的"方法,执行子类"具体的"方法.
重写:覆盖父类那个比较抽象的方法。
例如:图形管理器调用图形的计算面积方法
具体图形必须重写图形的计算面积方法。
继承是共性(计算面积),多态个性(长*宽 / pi *r**2)。
设计原则
开闭原则:允许增加新功能,不允许修改客户端代码.
单一职责:一个类有且只有一个改变的原因.
依赖倒置:调用抽象(父),不要调用具体(子);
抽象不要依赖具体.
组合复用:如果仅仅是代码的复用,优先使用组合.
类与类关系
泛化[继承](做成爸爸)
关联(做成成员变量)
依赖(做成方法参数)
"""
P151 Python核心-1.3 课后作业解析
"""
10:50 上课
定义员工管理器
1.管理所有员工
2. 计算所有员工工资
员工:
程序员:底薪 + 项目分红
销售:底薪 + 销售额 * 0.05
软件测试...
...
要求:增加新岗位,员工管理器不变.
"""
class EmployeeManager:
def __init__(self):
self.__employees = []
def add_employee(self, emp):
self.__employees.append(emp)
def get_total_saraly(self):
total_saraly = 0
for item in self.__employees:
# 调用是抽象的员工类
# 执行是具体的员工(程序员/销售..)
total_saraly += item.calculate_salary()
return total_saraly
class Employee:
def __init__(self, base_salary):
self.base_salary = base_salary
def calculate_salary(self):
return self.base_salary
# ---------------------------------------
class Programmer(Employee):
def __init__(self, base_salary, bonus):
super().__init__(base_salary)
self.bonus = bonus
def calculate_salary(self):
# return self.base_salary + self.bonus
# 扩展重写
return super().calculate_salary()+ self.bonus
class Salesmen(Employee):
def __init__(self, base_salary, sale_value):
super().__init__(base_salary)
self.sale_value = sale_value
def calculate_salary(self):
return self.base_salary + self.sale_value * 0.05
# 测试
manager = EmployeeManager()
manager.add_employee(Programmer(200000,500))
manager.add_employee(Salesmen(2000,1000))
print(manager.get_total_saraly())
P152 Python核心-1.4 内置可重写函数
一、内置可重写函数
Python中,以双下划线开头、双下划线结尾的是系统定义的成员。我们可以在自定义类中进行重写,从而改变其行为。如:
__str__函数:将对象转换为字符串(对人友好的)
__repr__函数:将对象转换为字符串(解释器可识别的)
其实直接print列表的引用,会打印出列表,是因为列表的类里的__str__函数被复写成了那个形式
二、示例代码
补充知识点,利用eval和repr可以克隆对象,如 s02 = eval(repr(s01))
class StudentModel:
def __init__(self, name="", age=0, score=0, id=0):
self.name = name
self.age = age
self.score = score
self.id = id
# 对象 --> 字符串 (随意格式)
def __str__(self):
return "我叫%s,编号是%d,年龄是%d,成绩是:%d"%(self.name,self.id,self.age,self.score)
# 对象 --> 字符串(解释器可识别,有格式)
def __repr__(self):
return "StudentModel('%s',%d,%d,%d)"%(self.name,self.age,self.score,self.id)
s01 = StudentModel("无忌",27,100,101)
str01 = str(s01)
print(str01)
print(s01)
str02 =repr(s01)
print(str02)
# 根据字符串执行python代码
re = eval("1+2*