zoukankan      html  css  js  c++  java
  • 贰拾

    继承

    一、继承

    ​ 承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。

    ​ 子类会继承父类的属性,解决代码过长冗余

    ​ 继承的分类:新式类、经典类。

    ​ 新式类:继承了object类就是新式类,python 3中,默认都继承object类,因此都是新式类。二在python 2中只有显式指定继承object才是新式类。

    ​ 经典类:没有继承object类的就是经典类,python 2中有经典类,python 3中没有经典类

    class A(object):
        pass
    class C:
        pass
    #B继承了A,C这个类
    class B(A,C):
        pass
    
    print(C.__bases__)
    

    二、利用继承减少代码冗余

    ​ 在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同,我们不可能从头开始写一个类B,这就用到了类的继承的概念。

    ​ 通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用。

    class Person(object):
    	school = 'jialidun'
        
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    class Teacher(Person):
    	pass
    
    class Student(Person):
        pass
    
    # 类实例化会自动调用__init__如果类中没有,去父类中找
    # stu1=Student()   #报错,因为父类中必须传两个参数
    stu1 = Student('xian_hu',20)
    print(stu1.name)
    print(stu1.age)
    print(stu1.school)
    stu1.school='xxx'
    print(stu1.school)
        
    xiao_hu
    18
    jialidun
    xxx
    
    
    

    2.1 多层继承

    class A:
        a = 'AAAA'
    class B(A):
        a = 'BBBB'
    class C (B):
        a = 'CCCC'
    class D(C):
     	pass
    d = D()
    print(d.a)
    
    
    CCCC
    

    ​ 多层继承为一次向上继承

    2.2 多继承

    class A:
        a="AAAA"
        pass
    class B:
        a="BBB"
        pass
    
    class C:
        a="CCC"
        pass
    
    class D(A,B,C):
        pass
    d=D()
    print(d.a)
    
    AAAA
    
    class A:
        # a="AAAA"
        pass
    class B:
        a="BBB"
        pass
    
    class C:
        a="CCC"
        pass
    
    class D(A,B,C):
        pass
    d=D()
    print(d.a)
    
    BBB
    

    ​ 多继承为从左至右继承

    2.3 多层多继承(菱形问题)

    class G(object):
        a = "GGG"
        pass
    class F(G):
        pass
    class E(G):
        pass
    class D(G):
        pass
    class C(F):
        pass
    class B(E):
        pass
    class A(B,C,D):
        pass
    
    a=A()
    print(a.a)
    
    GGG
    

    ​ 继承的菱形问题分为新式类和经典类,二者的查找顺序不同。

    img

    img

    ​ 新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点。

    ​ 经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)。

    三、重用父类方法

    3.1 指名道姓

    ​ 继承父类方法方式一:指名道姓,但是实际上并没有继承关系。使用方法是子类def + __init__直接调用父类定义的函数。

    3.2 super关键字

    ​ 继承父类方法方式二:super关键字。

    class Person(object):
        school = 'oldboy'
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def study(self):
            print('study....')
    
    class Student(Person):
        school = 'yyyy'
        def __init__(self,name,age,course):
    
            super().__init__(name,age)
           super(Student,self).__init__(name,age)
            self.course=course
        def study(self):
            # Person.study(self)
            super().study()
            # print("%s学生在学习"%self.name)
    
    

    ​ 注意:super() 会按照mro列表拿到父类对象;对象来调用绑定方法,不需要传递第一个参数(self)。

    ​ super关键字方法也分别为新式类和经典类,python 3使用新式类super().方法。python 3使用super(类名,对象). 的方法。

    ​ 总结:有继承关系的时候,通常用super。没有继承关系或者如果继承了多个父类,super是按照mro列表找,现在想指名道姓的用某个父类的某个方法,就需要指名道姓的使用

  • 相关阅读:
    hdu1006
    矩阵快速幂计算hdu1575
    MATLAB逻辑函数
    pair类型
    MATLAB基础操作符与数据格式显示
    MATLAB矩阵基础运算
    状态压缩DP常遇到的位运算
    HDU1565方格取数
    C语言的数组名和对数组名取地址
    ubunut 12.04 (64bit) android编译环境搭建
  • 原文地址:https://www.cnblogs.com/tangceng/p/11420113.html
Copyright © 2011-2022 走看看