zoukankan      html  css  js  c++  java
  • day24

    今日内容

    继承介绍

    以及继承的基本用法

    继承

      什么是继承?

        是一种新建类的方法,新建的类叫子类/派生类,被继承的类叫父类/基类/超类

        特点:

          1、子类遗传/继承父类的属性

          2、一个子类可以继承多个父类

          3、在继承的背景下,子类分为两种:新式类、经典类

          注:python2中会区分,在python3中所有类都默认继承object,所以在python3中所有类都是新式类

          经典类:没有继承object的类,以及该类的子类……都叫经典类

          新式类:就是继承了object的类,以及该类的子类……都叫新式类

         使用继承这种方式的好处:可以大大减少代码冗余

    #########################################################

    class Parent1(object):
    pass

    class Parent2(object):
    pass

    class Sub1(Parent1):#sub1继承了parent1
    pass

    class Sub2(Parent1,Parent2):#sub2继承了parent1和parent2
    pass

    print(Parent1.__bases__)#__bases__可以查看改类继承了那些类
    print(Parent2.__bases__)
    print(Sub1.__bases__)
    print(Sub2.__bases__)

    #########################################################

    利用继承可以解决代码之间的冗余

    首先,需要抽象出该父类下的子类的相同点,

    然后,在父类中的__init__设置好子类的相同属性(因为子类可以公用父类的这些属性)

    最后,再派生出一个个子类。

    ############################################################

    class 动物:

      def 吃(self):

       pass 

      def 喝(self):

       pass 

      def 拉(self):

       pass 

      def 撒(self):

       pass 

    class 狗(动物):

      def 叫声:

        print(‘汪汪汪’)

    class 猫(动物):

      def 叫声:

        print(‘喵喵喵’)

    ##############################################################

    在子类的派生的新方法中,重用父类的功能方式一:

      指名道姓的使用某一类中的函数

    总结:

    1、与继承无关

    2、访问类的函数,没有自动传值的效果

    ##########################################

    class zjnu:
    school = 'zjnu'

    def __init__(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex

    class Student(zjnu):
    def __init__(self, name, age, sex, score=0):
    zjnu.__init__(self,name,age,sex)
    self.score = score


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

    ##################################################

    在单继承的背景下,属性查找的优先级

    对象==>对象的类==>父类==>父类……

    #####################################################

    class Foo:
    def f1(self):
    print('Foo.f1')

    def f2(self):
    print('Foo.f2')
    self.f1() #obj.f1()

    class Bar(Foo):
    def f1(self):
    print('Bar.f1')

    obj=Bar()
    obj.f2()
    '''
    Foo.f2
    Bar.f1
    '''

    #####################################################

    在多继承的背景下,属性查找的优先级:

    如果一个子类继承多个分支(多个子类没有共同继承一个非object的类)

    此时属性查找的优先级:对象==>对象的类==>从左到右的顺序一个一个按照分支查找

    ############################################################

    # 第四层:
    class G:
    # x = 'G'
    pass

    # 第三层
    class E(G):
    # x = 'E'
    pass

    class F:
    # x = 'F'
    pass

    # 第二层
    class B(E):
    # x = 'B'
    pass

    class C(F):
    # x = 'C'
    pass

    class D:
    # x = 'D'
    pass

    # 第一层
    class A(B, C, D):
    # x = 'A'
    pass

    obj = A()
    # obj.x = 111
    print(obj.x)

    ##############################################################

    菱形查找问题:

    新式类:一个个按照从左到右的顺序查找,最后再查找顶级类

    经典类:一个个按照从左到右的顺序查找,直接查找到顶级类

    python专门为新式类内置了一个mro的方法,用来查看c3算法(属性查找的规律的一种算法)的计算结果

      在子类派生的新方法中重用父类功能的方式二:

      在python2中:super(自己的类名,自己的对象)

      在python3中:super()

      调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性(完全参照mro列表)

      总结:

        1、严格依赖继承的mro列表

        2、访问时绑定方法,有自动传值的效果

    ##############################################################

    class zjnu:
    school = 'zjnu'

    def __init__(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex

    class Student(zjnu):
    def __init__(self, name, age, sex, score=0):
    super(Student,self).__init__(name,age,sex)
    self.score = score

    class Teacher(zjnu):
    def __init__(self,name,age,sex,level):
    super().__init__(name,age,sex)
    self.level=level
    stu1=Student('lay',38,'male')
    print(stu1.__dict__)

    tea1=Teacher('ybg',88,'male',10)
    print(tea1.__dict__)

    #############################################################

  • 相关阅读:
    CF 256C Furlo and Rublo and Game【博弈论,SG函数】
    opengl笔记——OpenGL好资料备忘
    SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑
    ORACLE数据库对比表结构
    SSRS Reports 2008性能优化案例二
    Linux LVM学习总结——扩展卷组VG
    MySQL备份还原——AutoMySQLBackup介绍
    mysqldump: Got error: 1142: SELECT, LOCK TABLES command denied to user 'root'@'localhost' for table 'accounts' when using LOCK TABLES
    MySQL备份还原——mysqldump工具介绍
    ORACLE查看数据文件包含哪些对象
  • 原文地址:https://www.cnblogs.com/yaoxiaofeng/p/9506855.html
Copyright © 2011-2022 走看看