一、菱形问题练习
新式类下广度优先遍历
# 练习一: class H: pass class G(H): pass class E(G): pass class C(G): pass class B(E): pass class F(H): pass class D(F): pass class A(B,C,D): pass print(A.mro()) ''' [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.G'>, <class '__main__.D'>, <class '__main__.F'>, <class '__main__.H'>, <class 'object'>] ''' print(A.__bases__) # (<class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>)
练习二:使用property与继承简化选课系统
1、引入属性访问控制+property
2、引入继承与派生的概念来减少代码冗余
注意:要满足什么"是"什么的关系,不满足"是"的关系不要去继承
import uuid import pickle # 公共父类,用来存放相同的初始化操作,以及保存、添加列表操作 class Father: school_name = "老男孩" def __init__(self,name): self.name = name self.id = uuid.uuid4() self.list = [] def save(self): with open(f"db\\{self.id}.pickle", mode="wb") as f: pickle.dump(self, f) def add_list(self,id): self.list.append(id) class School(Father): def __init__(self, nickname, address): Father.__init__(self,nickname) self.address = address def tell_class(self): print(self.name.center(50, "=")) for class_id in self.list: with open(f"db\\{class_id}.pickle", mode="rb") as f: class_obj = pickle.load(f) class_obj.tell_course() class Class(Father): stu_list = [] def relate_student(self, student_obj): self.stu_list.append(student_obj.id) def tell_course(self): print("%-10s " % self.name, end=" ") with open(f"db\\{self.list[0]}.pickle", mode="rb") as f: course = pickle.load(f) print(course.info) class Course(Father): def __init__(self, name, time, cost): Father.__init__(self,name) self.time = time self.cost = cost @ property def info(self): course_info = "课程名:%-10s 时长:%s,费用:%s" % (self.name, self.time, self.cost) return course_info # 人物类,抽象出一个共同的人物类,来简化实例化的代码 class People: def __init__ (self,name,age,gender): self.name = name self.age = age self.gender = gender self.id = uuid.uuid4() class Student(People,Father): def __init__(self, name, age, gender, num): People.__init__(self,name,age,gender) self.num = num self.class_obj = None @ property def info(self): stu_info = "姓名:%-5s 年龄:%s 性别:%s,学号:%-5s" % (self.name, self.age, self.gender, self.num) return stu_info def chose_class(self, class_id): self.class_id = class_id def tell_class(self): print(f"学生【{self.name}】班级信息".center(50, "=")) with open(f"class\\{self.class_id}.pickle", mode="rb") as f: class_obj = pickle.load(f) class_obj.tell_course() class Teacher(People,Father): def __init__(self,name,age,gender,salary,rank): People.__init__(self,name,age,gender) self.salry = salary self.rank = rank self.stu_dic = {} def score(self, student_obj, grade): student_obj.score = grade self.stu_dic[student_obj.name] = grade @ property def info(self): tea_info = "姓名:%-5s 年龄:%s 性别:%s,薪资:%s,等级:%-5s" % (self.name, self.age, self.gender, self.salry,self.rank) return tea_info # 实例化对象 stu1 = Student("Jil", 18, "mal", 1118) s1 = School("猪猪校区", "上海徐汇") c1 = Class("猪猪基础班") c2 = Class("猪猪进阶班") course1 = Course("猪的自我修养", "6 months", 20000) course2 = Course("养猪宝典", "5 months", 18000) t1 = Teacher("Egon",25,"male",50000,"天字一号") # 关联 s1.add_list(c1.id) s1.add_list(c2.id) c1.add_list(course1.id) c2.add_list(course2.id) # 存入文件 s1.save() c1.save() c2.save() course1.save() course2.save() stu1.save() s1.tell_class()