zoukankan      html  css  js  c++  java
  • 【python】-- 类的多继承、经典类、新式类

    继承知识点补充

    在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类。

    一、多继承

    之前我们都是讲的单继承,那么什么是多继承呢?说白了,就是:子类可以继承多个父类,就叫多继承。

    class SchoolMember(object):  #SchoolMember类
        '''学校成员基类'''
        def tell(self):
            print("the schoolmeber is tell...")
     
    class School(object):     #School类
        """学校类"""
        def open_branch(self,addr):
            print("openning a new branch in",addr)
     
    class Teacher(SchoolMember,School):   #子类Teacher同时继承了SchoolMember,School两个类
        "讲师类"
        def teaching(self):
            "讲课方法"
            print("Teacher xiaogao is teaching python")
     
    t1 = Teacher()
    t1.tell()   #拥有父类SchoolMember的tell方法
    t1.open_branch("shanghai")  #拥有父类School的open_branch方法

    二、新式类

    1、概念

    新式类定义时必须继承object类,被定义继承了object类的,就叫做新式类

    class Person(object):  #继承object类
        "新式类"

    2、继承构造方法

    新式类初始化构造方法用super关键字去继承

    super(子类,self).__init__(name,age)

    3、调用父类中相同方法或者相同属性的顺序

    新式类多继承的调用方法是顺序是:广度优先查询,如下图:

    代码实验如下:

    ①全部代码

    class A(object):  #新式类
        def __init__(self):
            self.n = "A"
    
    class B(A):
        def __init__(self):
            self.n = "B"
    
    class C(A):
        def __init__(self):
            self.n = "C"
    
    class D(B,C):
        def __init__(self):
            self.n = "D"
    
    d = D()
    print(d.n)
    
    #输出
    D
    
    全部代码
    View Code

    先找自己本身类的属性,输出D

    ②注释D类中代码

    class A:
        def __init__(self):
            self.n = "A"
    
    class B(A):
        def __init__(self):
            self.n = "B"
    
    class C(A):
        def __init__(self):
            self.n = "C"
    
    class D(B,C):
        pass
    
    d = D()
    print(d.n)
    
    #输出
    B
    View Code

    ③注释B类中的代码

    class A:
        def __init__(self):
            self.n = "A"
    
    class B(A):
        pass
    
    class C(A):
        def __init__(self):
            self.n = "C"
    
    class D(B,C):
        pass
    
    d = D()
    print(d.n)
    
    #输出
    A
    View Code

    ④注释C类中的代码

    class A(object):
        def __init__(self):
            self.n = "A"
    
    class B(A):
        pass
    
    class C(A):
        pass
    
    class D(B,C):
        pass
    
    d = D()
    print(d.n)
    
    #输出
    A 
    View Code

     三、经典类

    1、概念

    经典类定义,什么都不继承

    class Person:
        "经典类"

    2、继承构造方法

    父类.__init(self,name,age)

    3、调用父类中相同方法或者相同属性的顺序

    经典类多继承的调用方法是顺序是:深度优先查询,如下图:

     代码实验如下:

    ①全部代码

    class A:#经典类
        def __init__(self):
            self.n = "A"
    
    class B(A):
        pass
        def __init__(self):
            self.n = "B"
    
    class C(A):
        def __init__(self):
            self.n = "C"
    
    class D(B,C):
        def __init__(self):
            self.n = "D"
    
    d = D()
    print(d.n)
    
    #输出
    D
    View Code

    ②注释D类中代码

    class A:
        def __init__(self):
            self.n = "A"
    
    class B(A):
        def __init__(self):
            self.n = "B"
    
    class C(A):
        def __init__(self):
            self.n = "C"
    
    class D(B,C):
        pass
    
    d = D()
    print(d.n)
    
    #输出
    B
    View Code

    ③注释B类中的代码

    class A:
        def __init__(self):
            self.n = "A"
    
    class B(A):
        pass
    
    class C(A):
        def __init__(self):
            self.n = "C"
    
    class D(B,C):
        pass
    
    d = D()
    print(d.n)
    
    #输出
    A
    View Code

    ④注释A类中的代码

    class A:
        pass
    
    class B(A):
        pass
    
    class C(A):
        def __init__(self):
            self.n = "C"
    
    class D(B,C):
        pass
    
    d = D()
    print(d.n)
    
    #输出
    C
    View Code

    总结:

    1. 新式类继承object类,经典类不继承任何类
    2. 新式类用super关键字继承构造方法,经典类用 父类.__init(self)来继承
    3. 新式类:广度优先查询,经典类:深度优先查询(因为新式类讲究的是新,所以要找最近的,最新的;然后经典的讲究古老,所以更远更深的)
    4. 值得注意的是,我们上面是在python2中做的,在python3中不管是经典类还是新式类,都是采用的是广度优先查询,已经废弃2中的深度查询了
  • 相关阅读:
    学号 20175212童皓桢 《Java程序设计》第8周学习总结
    20175212童皓桢 在IDEA中以TDD的方式对String类和Arrays类进行学习
    20175212童皓桢 Java实验二-面向对象程序设计实验报告
    学号20175212 《Java程序设计》第7周学习总结
    20175212童皓桢 结对编程项目-四则运算 第二周
    20175212童皓桢 类定义
    20175212童皓桢 《Java程序设计》第六周学习总结
    20175212童皓桢 结对编程项目-四则运算 第一周
    学号 20175212童皓桢 第五周迭代选做题学习
    学号 2018-2019-20175212 童皓桢《Java程序设计》第5周学习总结
  • 原文地址:https://www.cnblogs.com/Keep-Ambition/p/7290656.html
Copyright © 2011-2022 走看看