zoukankan      html  css  js  c++  java
  • 类的继承

    一丶继承介绍

    什么是继承
        继承是一种新建类的方式,新建的类称之为子类、派生类,被继承的类称之为父类、基类、超类

        python中继承的特点:
            1.继承的特性:子类可以遗传、重用父类的属性
            2.python中一个子类可以同时继承多个父类
            3.在继承背景下去说,python中的类分为两种:新式类,经典类
                新式类:但凡继承了object的类Foo,以及该类的子类...都是新式类
                    在python3中一个类即便是没有显示地继承任何类,默认就会继承object
                    即python3中所有的类都是新式类
                经典类:没有继承object的类,以及该类的子类...都是经典类
                    在python2中才区分新式类与经典类
                    在python2中一个类如果没有显示地继承任何类,也不会会继承object

    二丶利用继承来解决类与类之间的代码冗余问题

    继承关系的查找
    总结对象之间的相似之处得到类,总结类与类之间的相似之处就得到了类们的父类

    class oldboyPeople:
        school = 'oldboy'

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

    class oldboyStudent(oldboyPeople):
        # def __init__(self,name,age,sex,score = 0):
        #     self.name = name
        #     self.age = age
        #     self.sex = sex
        #     self.score = score
        def choose_course(self):
            print('%s choosing course'%self.name)

    class oldboyTeacher(oldboyPeople):
        # def __init__(self,name,age,sex,level):
        #     self.name = name
        #     self.age = age
        #     self.sex = sex
        #     self.level = level
        def score(self,stu,num):
            stu.score = num

    stu1 = oldboyStudent('蕲艾',18,'male')
    print(stu1.__dict__)

    tea1 = oldboyTeacher('egon',18,'male')
    print(tea1.__dict__)

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

    在子类派生出的新方法中重用父类功能的方式一:
    指名道姓的引用某一个类中的函数
    总结:
    1. 与继承无关
    2. 访问的是类的函数,没有自动传值

    class oldboyPeople:
        school = 'oldboy'

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

    class oldboyStudent(oldboyPeople):
        def __init__(self,name,age,sex,num = 0):
            oldboyPeople.__init__(self,name,age,sex)

            self.score = num

        def choose_course(self):
            print('%s is choosing course' %self.name)


    class oldboyTeacher(oldboyPeople):
        def __init__(self,name,age,sex,level):
            oldboyPeople.__init__(self,name,age,sex)

            self.level = level

        def score(self,stu,num):
            stu.score = num


    stu1 = oldboyStudent('蕲艾',18,'female')
    print(stu1.__dict__)

    tea1 = oldboyTeacher('egon',18,'male',10)
    print(tea1.__dict__)

    四丶在单继承背景下的属性查找

    在单继承背景下的属性查找的顺序:对象->对象的类->父类->...
    class Foo:
        def f1(self):
            print('Foo.f1')

        def f1(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)

    菱形继承问题:
    新式类 : 广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类
    经典类 : 深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类

    新式类(广度优先): obj->A->B->E->C-F->D->G->object
    经典类(深度优先): obj->A->B->E->G->C-F->D

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

    在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
    在python2中:super(自己的类名,自己的对象)
    在python3中:super()
    调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!
    总结:
      1. 严格依赖继承的mro列表
      2. 访问是绑定方法,有自动传值的效果

    class A:
        def f1(self):
            print('A.f1')
            super().f2()

    class B:
        def f2(self):
            print('B.f2')

    class C(A,B):
        def f2(self):
            print('C.f2')

    obj=C()
    print(C.mro())
    obj.f1()
    '''
    A.f1
    '''

  • 相关阅读:
    如遇临时表无法删除
    ORA-00054:resource busy and acquire with nowait specified解决方法
    查看用户建立详细原语句
    dbtool部署
    启动uiautomatorview 提示无法初始化主类
    运行虚拟机报错:CPU acceleration status: HAXM is not installed on this machine
    Appium-Python-Windows 环境搭建
    Vagrant安装Docker
    XPath
    Selenium之元素定位
  • 原文地址:https://www.cnblogs.com/Mister-JH/p/9506350.html
Copyright © 2011-2022 走看看