第二十天

今日内容

一、继承应用

1.1在子类派生的新方法中重用父类的功能

  方式一:与继承无关,直接调用另一个类的功能
          class Summary():
             school = "上海校区"
             def __init__(self,name,age,gender):
                 self.name = name
                 self.age = age
                 self.male = gender
        
         class Student(Summary):
             def choose(self):
                 print("%s 选课成功" % (self.name))

         stu1 = Student("aaa",18,"male")
         stu2 = Student("bbb",19,"male")
         stu3 = Student("ccc",20,"male")

         class Teacher():
             school = "上海校区"
             def __init__(self,name,age,gender,level):
                 Summary.__init__(self,name,age,gender)   #直接调用Summary功能
                 self.level = level
             def score(self):
                 print("%s 正在打分" % (self.name))

         ter1 = Teacher("xxx",38,"male",10)
         ter2 = Teacher("yyy",28,"male",1)
         print(ter1.__dict__)

  方式二:supwe的运用,严格按照继承顺序来查找属性
        class Summary():
            school = "上海校区"

            def __init__(self,name,age,gender):
                self.name = name
                self.age = age
                self.male = gender

        class Teacher(Summary):
            def __init__(self,name,age,gender,level):
                super(Teacher, self).__init__(name,age,gender)
                self.level = level

            def score(self):
                print("%s 正在打分" % (self.name))

        tea1 = Teacher("XXX",18,"meal",10)
        print(tea1.__dict__)

  案例一:super是按照发起者的mro列表依次往后查找
        class A():
            def test(self):
                print("from A")
                super().test()

        class B():
            def test(self):
                print("from B")

        class C(A,B):
            pass
        obj = C()     #当前发起者为C类,C的mro列表为[C,A,B,object],当test先找到A内,
        obj.test()    #然后A内的super().test()再沿着A继续往下找就找到了B

        obj1 = A()
        obj1.test()  #会报错,因为A内的super().test()会找到object内,而object内没有test

1.2mixins机制

  继承表达的是一个is a 的关系,在使用多继承时主要继承的父类放在继承括号的右边,
  只需要使用其功能的父类放在左边并取名为Mixins结尾
  例:
   class Vehicle():
       def vehicle(self):
           print("交通工具的功能")

   class FlyMixins():
       def flying(self):
           print("飞行的功能")

   class CivlAircraft(FlyMixins,Vehicle):
       print("明航飞机")

   class Helicopter(FlyMixins,Vehicle):
       print("直升飞机")
  
   class Car(Vehicle):
       print("汽车")

   obj2 = CivlAircraft()
   obj2.flying()

1.3组合运用

  原来继承用的是 is a (某种东西是某一类)的概念,组合是某种东西有某一功能的概念
  当你使用的功能不是is a 的概念就用组合
  例:
        class Summary():
            school = "上海校区"

            def __init__(self,name,age,gender):
                self.name = name
                self.age = age
                self.male = gender

        class Student(Summary):
            school = "上海校区"

            def choose(self):
                print("%s 选课成功" % (self.name))

        class Teacher():
            school = "上海校区"

            def __init__(self,name,age,gender,level):
                Summary.__init__(self,name,age,gender)
                self.level = level

            def score(self):
                print("%s 正在打分" % (self.name))

        class Course():
            def __init__(self,name,price,period):
                self.name = name
                self.price = price
                self.period = period

            def tell(self):
                print("课程信息<%s:%s:%s>" % (self.name,self.price,self.period))

        python = Course("python全栈开发",19800,"6mons")
        linux = Course("linux",19000,"5mons")

        stu1 = Student("XXX",18,"male")
        stu1.choose = python        #这时stu1不仅能调自己的信息还可以调用python对象的Course类功能
        stu1.choose.tell()
        print(stu1.name)
原文地址:https://www.cnblogs.com/kk942260238/p/14267771.html