zoukankan      html  css  js  c++  java
  • 面向对象【day07】:新式类和经典类(八)

    本节内容

    1、概述

    2、类的多继承

    3、经典类VS新式类

    4、总结

    一、概述

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

    二、类的多继承

    2.1 多继承

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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方法

    三、经典类VS新式类

    3.1、新式类

    1、概念

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

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

    2、继承构造方法

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

    1
    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

    没有问题,先找自己的属性,输出D

    ②注释D类中代码

     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):
         pass
     
     d = D()
     print(d.n)
     
     #输出
     B

    ③注释B类中的代码

     class A(object):
         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)
     
     #输出
     C

    ④注释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 

    3.2 经典类

    1、概念

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

    1
    2
    class Person:
        "经典类"

    2、继承构造方法

    1
    父类.__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

    ②注释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

    ③注释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

    ④注释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

    四、总结

    1. 新式类继承object类,经典类不继承任何类
    2. 新式类用super关键字继承构造方法,经典类用 父类.__init(self)来继承
    3. 新式类:广度优先查询,经典类:深度优先查询(因为新式类讲究的是新,所以要找最近的,最新的;然后经典的讲究古老,所以更远更深的)
    4. 值得注意的是,我们上面是在python2中做的,在python3中不管是经典类还是新式类,都是采用的是广度优先查询,已经废弃2中的深度查询了
  • 相关阅读:
    vscode调试pomelo和pomelo使用vscode调试
    linux修改单个进程的系统时间
    python之路目录
    python之前端
    python之ORM操作
    python之redis和memcache操作
    python之消息队列
    python之协程与IO操作
    python之进程与线程
    python之网络编程
  • 原文地址:https://www.cnblogs.com/luoahong/p/9895376.html
Copyright © 2011-2022 走看看