4.9---菱形问题、property、继承练习

一、菱形问题练习

新式类下广度优先遍历

# 练习一:
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()

猜你喜欢

转载自www.cnblogs.com/zhubincheng/p/12669950.html