zoukankan      html  css  js  c++  java
  • DAY 24继承与组合

    一.继承

      继承就是子类与父类形成的一种关系,可以让子类能直接从父类中获取属性与方法

      优点:减少了类与类之间的代码冗余

      语法:

        class 父类: # 父类是多个有共同点的普通类抽离共有属性与方法形成的类

          pass  

        class 类名(父类名):

          pass

      1.继承的信息

        1.父类的所有未封装的属性和方法,子类都能访问

        2.父类的所有封装的属性和方法,子类都不能访问

            -- 在外界通过子类或子类对象,不能访问

            -- 在子类内部也不能访问

      2.有父类时的属性(方法)的查找顺序

         class Sup:

           num = 10

           def test(self):

             print('sup test')

         class Sub(Sup):

           num = 20

           def test(self):

             print('sub test')

        print(num) # 20

        print(Sub.test()) # sub test

        1.优先找自身,自身没有找父类

        2.父类没有找父类的父类

        3.一直找到最顶级的父类,如果还没有则报错

      3.方法的重写

        继承与派生

        先写子类,抽离 出父类

        先写父类,派生 出子类

        如果先写父类,由于父类的方法功能不能满足子类的需求

        子类可以重写父类的方法:方法名与父类相同,自定义方法的实现体

         class Sup:

           def test(self):

             print('sup test')

         class Sub(Sup):

           def test(self):

             print('sub test')

      4.方法的重用

        重用:还需要使用父类的功能,在父类的方法功能基础上再添加新功能

        突破点:在子类中调用父类的方法,还要保证调用者是子类(子类对象)

        子类中利用super(子类,当前子类对象)可以调用父类的方法

        python3中可以简写为super()

         class Sup:

           def test(self):

             print('sup test')

         class Sub(Sup):

           def test(self):

             super().test()

             print('sub test')

         Sub().test() # sup test sub test

      5.__init__结合super()使用      

        class Sup:

           def test(self):
        print(self)

       def __init__(self, name):
       self.name = name
       class Sub(Sup):
    # 有继承关系下,只要名字相同,即使产生不同,还是属于同一个方法
      def test(self, num):
       super().test()
       print(num)

    # 默认父级的__init__可以被继承过来,
    # 但是会出现子类对象的属性比父类多

       def __init__(self, name, salary):
      super().__init__(name) # 父级有的共性功能通过super()交给父级做
      self.salary = salary # 子类特有的自己来完成

      # Sub().test(10)
      # Sub().test() # 使用还是使用自身带参的,不能使用父级不带参的
      # (本质名字相同就是一个,优先查找自己的)

      6.多继承

        1.简单的多继承
        # 属性的查找顺序:优先找自己的,如果没有,按照继承先后查找父级
          class A:
            name = 'A'
            num = 10

          class B:
            name = 'B'
            count = 100
        # 子类可以继承所有父类的所有可继承属性
          class C(A, B): # 自己 => A => B
            name = 'C'
            pass
          print(C.num)
          print(C.count)
          print(C.name)
        # 打印属性查找的顺序
          print(C.mro())

        # 经典类:python2中才有,没有继承任何类的类
        # 新式类:python2中直接或间接继承object的类,python中所定义的所有类
          class G: name = "G"
          class C(G): pass
          class B(C): pass
          class E(G): pass
          class D(E): name = "D"
          class F(G): pass
          class A(B, D, F): pass
          print(A.mro()) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>,

           <class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.G'>, <class 'object'>]

    二.组合

      # 自定义类的对象作为另外一个类的属性

      class Teacher:
      def __init__(self, name, age):
      self.name = name
      self.age = age


      t1 = Teacher("Owen", 17)
      print(type(t1.name), type(t1.age))


      class Student:
      # 学生可以有 老师 属性
      def __init__(self, name, age, teacher):
      self.name = name
      self.age = age
       # 自定义类的对象作为类的属性:组合
       self.teacher = teacher

     

        

  • 相关阅读:
    吉他 摄影
    前端思考独处时间自我成长
    约束力
    js算法
    旅行计划
    生产者消费者问题
    Lock锁
    线程和进程
    什么是JUC
    GC日志分析和垃圾回收器的新展望
  • 原文地址:https://www.cnblogs.com/majingjie/p/10736588.html
Copyright © 2011-2022 走看看