作业一:自己试验一下菱形问题下的属性查找顺序
class X(object):
def test(self):
print('from X')
pass
class Y(X):
def test(self):
print('from Y')
pass
class Z(X):
# def test(self):
# print('from Z')
pass
class A(Z, Y):
# def test(self):
# print('from A')
pass
#
print(A.mro()) # 类D以及类D的对象访问属性都是参照该类的mro列表
# 输出:[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
obj = A()
obj.test() # from Y
# 查找顺序:A ==> Z ==> Y ==> X ==> object
作业二:在昨天作业的基础之上
1、引入属性访问控制+property
2、引入继承与派生的概念来减少代码冗余
注意:要满足什么"是"什么的关系,不满足"是"的关系不要去继承
import uuid
import pickle
class Info:
def __init__(self, name):
self.name = name
self.uid = str(uuid.uuid4())
@property
def save(self):
with open(f'info/{self.uid}.pickle', mode='wb')as f:
pickle.dump(self, f)
@property
def get(self):
with open(f'info/{self.uid}.pickle', mode='rb')as f:
res = pickle.load(f)
print(res.__dict__)
# 学校(校区名、地址、关联班级列表)
class School(Info):
def __init__(self, name, address):
Info.__init__(self, name)
self.address = address
self.class_list = []
@property
def show_school_info(self):
print(f'校区信息 | 名称:{self.name} 地址:{self.address}')
for class_id in self.class_list:
with open(f'info/{self.uid}.pickle', mode='rb') as f:
class_obj = pickle.load(f)
class_obj.show_class_info()
# 校区创建完毕后,可以为每个校区关联班级
def related_class(self, class_obj):
self.class_list.append(class_obj.id)
# 班级(名称、所在校区、关联课程列表)
class Class(Info):
def __init__(self, name, school):
Info.__init__(self, name)
self.id = uuid.uuid4()
self.school = school
self.course_list = []
def show_class_info(self):
print(f' 班级信息 | 名称:{self.name} 校区:{self.school}')
# 班级创建完毕后,可以为每个班级关联课程
def related_course(self, course_obj):
self.course_list.append(course_obj.id)
# 课程(课程名、周期、价格)
class Course(Info):
def __init__(self, name, period, price):
Info.__init__(self, name)
self.id = uuid.uuid4()
self.period = period
self.price = price
def show_course_info(self):
print(f'课程信息 | 名称:{self.name} 周期:{self.period} 价格:{self.price}')
# 学生(所在校区、名字、年龄、学号、性别、选择课程)
class Student(Info):
def __init__(self, school, name, age, stu_id, gender):
Info.__init__(self, name)
self.school = school
self.age = age
self.id = uuid.uuid4()
self.gender = gender
self.stu_id = stu_id
self.class_name = []
def show_student_info(self):
print(
f'学生信息 | 姓名:{self.name} 校区:{self.school} 年龄:{self.age} 学号:{self.stu_id} 性别:{self.gender} 已选课程:{self.class_name}')
def choose_class(self, class_name):
self.class_name = class_name
# 老师(名字、年龄、薪资、等级、给学生评分)
class Teacher(Info):
def __init__(self, name, age, salary, level):
Info.__init__(self, name)
self.id = uuid.uuid4()
self.salary = salary
self.age = age
self.level = level
def show_teacher_info(self):
print(f'老师信息 | 姓名:{self.name} 年龄:{self.age} 薪资:{self.salary} 等级:{self.level}')
def student_score(self, student_obj, score):
student_obj.score = score
# 创建学校对象(校区名、地址、关联班级列表)
school_obj1 = School('老男孩上海校区', '上海市青浦区')
school_obj2 = School('老男孩北京校区', '北京市海淀区')
# 序列化保存学校信息
school_obj1.save
school_obj2.save
# 创建班级对象(名称、所在校区)
class_obj1 = Class('脱产14期', '上海校区')
class_obj2 = Class('脱产15期', '上海校区')
class_obj3 = Class('脱产29期', '北京校区')
# 序列化保存班级信息
class_obj1.save
class_obj2.save
class_obj3.save
# 关联学校和班级
school_obj1.related_class(class_obj1)
school_obj1.related_class(class_obj2)
school_obj2.related_class(class_obj3)
# 反序列化得到班级信息
school_obj1.show_school_info
school_obj2.show_school_info
# 创建课程对象(课程名、周期、价格)
course_obj1 = Course('egon养成培训', '6-month', 10)
course_obj2 = Course('单身狗的养成', '3-month', 998)
# 序列化保存学校信息
course_obj1.save
course_obj2.save
# 创建学生对象(所在校区、名字、年龄、学号、性别、选择课程)
student_obj1 = Student('老男孩上海校区', '真·egon真身', 18, 2020001, 'male')
student_obj2 = Student('老男孩上海校区', 'egon试验品1', 19, 2020002, 'male')
student_obj3 = Student('老男孩北京校区', 'egon试验品2', 78, 2020003, 'female')
# 序列化保存班级信息
student_obj1.save
student_obj2.save
student_obj3.save
# 关联学校和班级
student_obj1.choose_class(course_obj1)
student_obj2.choose_class(course_obj1)
student_obj3.choose_class(course_obj2)
# 反序列化得到班级信息
student_obj1.show_student_info
student_obj2.show_student_info
student_obj3.show_student_info