python中的多重继承实例讲解

python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性。

对经典类和新式类来说,属性的查找顺序是不同的。现在我们分别看一下经典类和新式类两种不同的表现:

经典类:

代码如下:

#! /usr/bin/python
# -*- coding:utf-8 -*-

class P1():
    def foo(self):
        print 'p1-foo'

class P2():
    def foo(self):
        print 'p2-foo'
    def bar(self):
        print 'p2-bar'

class C1(P1,P2):
    pass

class C2(P1,P2):
    def bar(self):
        print 'C2-bar'

class D(C1,C2):
    pass

if __name__ =='__main__':
    d=D()
    d.foo()
    d.bar()

执行的结果:

代码如下:

p1-foo
p2-bar

将代码实例,画了一个图,方便理解:

从上面经典类的输出结果来看,

实例d调用foo()时,搜索顺序是 D => C1 => P1,

实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

总结:经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。

新式类:

代码如下:

#! /usr/bin/python
# -*- coding:utf-8 -*-

class P1(object):
    def foo(self):
        print 'p1-foo'
       
class P2(object):
    def foo(self):
        print 'p2-foo'
    def bar(self):
        print 'p2-bar'
       
class C1(P1,P2):
    pass
   
class C2(P1,P2):
    def bar(self):
        print 'C2-bar'
       
class D(C1,C2):
    pass

if __name__ =='__main__':
    print D.__mro__   #只有新式类有__mro__属性,告诉查找顺序是怎样的
    d=D()
    d.foo()
    d.bar()

执行的结果:

代码如下:

(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.P1'>, <class '__main__.P2'>, <type 'object'>)

p1-foo
C2-bar

从上面新式类的输出结果来看,

实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1

实例d调用bar()时,搜索顺序是 D => C1 => C2

总结:新式类的搜索方式是采用“广度优先”的方式去查找属性。

(0)

相关推荐

  • Python实现类继承实例

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例. 实例代码如下: #! /usr/bin/python # Filename: inherit.py # Author: yanggang class SchoolMember: def __init__(self,name,age): self.name = name self.age = age print 'init SchoolMember: ', self.name def tel

  • Python类的多重继承问题深入分析

    正文 首先得说明的是,Python的类分为经典类 和 新式类 经典类是python2.2之前的东西,但是在2.7还在兼容,但是在3之后的版本就只承认新式类了 新式类在python2.2之后的版本中都可以使用 经典类和新式类的区别在于: 经典类是默认没有派生自某个基类的,而新式类是默认派生自object这个基类的: 复制代码 代码如下: # old style class A():pass # new style class A(obejct):pass 2.经典类在类多重继承的时候是采用从左到右

  • python多重继承新算法C3介绍

    mro即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类). 在python2.2版本中,算法基本思想是根据每个祖先类的继承结构,编译出一张列表,包括搜索到的类,按策略删除重复的.但是,在维护单调性方面失败过(顺序保存),所以从2.3版本,采用了新算法C3. 为什么采用C3算法 C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. 本地优先级:指声明时父类的顺

  • 深入浅析python继承问题

    有如下的代码: class p1: def __init__(self,a,b): print("init in p1") self.a1=a self.b1=b self.f1() def f1(self): print("f1 in p1") class c1(p1): def __init__(self,a,b,c=2): print("init in c1") p1.__init__(self,a,b) self.c1=c self.f1

  • Python中类的继承代码实例

    相对于C++的继承编写,Python更简洁,而且效率也是很高的,下面编写一个简单Python的继承例子. 复制代码 代码如下: #!/usr/bin/python   #filename: pyclass.py     class Member:           def __init__(self, name, age):                   self.name = name                   self.age = age                  

  • Python类定义和类继承详解

    一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属性,那么将直接影响到已经实例化的对象   类的私有属性: __private_attrs  两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问 在类内部的方法中使用时 self.__private_attrs    类的方法 在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,

  • python多重继承实例

    本文实例讲述了python多重继承用法,分享给大家供大家参考.具体实现方法如下: 1.mro.py文件如下: #!/usr/bin/python # Filename:mro.py class P1: def foo(self): print 'called P1-foo' class P2: def foo(self): print 'called P2-foo' def bar(self): print 'called P2-bar' class C1(P1, P2): pass class

  • python中的多重继承实例讲解

    python和C++一样,支持多继承.概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性. 对经典类和新式类来说,属性的查找顺序是不同的.现在我们分别看一下经典类和新式类两种不同的表现: 经典类: 复制代码 代码如下: #! /usr/bin/python # -*- coding:utf-8 -*- class P1():     def foo(self):         print 'p1-foo' c

  • Python中生成ndarray实例讲解

    生成ndarray最简单的方法就是array函数,array函数接受任意的序列型对象,生成一个新的包含传递数据的NumPy数组.例子如下: import numpy as np data1 = [1, 2, 3, 4] data2 = [[1, 2, 3, 4], [5, 6, 7, 8]] arr1 = np.array(data1) arr2 = np.array(data2) arr1 = arr1 * 10 arr2 = arr2 + arr1 print(arr1) print(arr

  • Python中选择结构实例讲解

    1.选择结构通过判断条件是否成立来决定分支的执行. 2.选择结构形式:单分支.双分支.多分支. 3.多分支结构,几个分支之间有逻辑关系,不能随意颠倒顺序. 实例 ''' 单分支选择结构 if 条件表达式: 语句/语句块 ''' if 3+2==5: print("单分支选择结构") #true ''' 双分支选择结构 if 条件表达式: 语句/语句块 else 语句/语句块 ''' a = 3 if a<2: print('t'+str(a)) #true else: print

  • 在Windows中设置Python环境变量的实例讲解

    在 Windows 设置环境变量 在环境变量中添加Python目录: 在命令提示框中(cmd) : 输入 path=%path%;C:\Python 按下"Enter". 注意: C:\Python 是Python的安装目录. 也可以通过以下方式设置: • 右键点击"计算机",然后点击"属性" • 然后点击"高级系统设置" • 选择"系统变量"窗口下面的"Path",双击即可! • 然后

  • 基于python requests库中的代理实例讲解

    直接上代码: #request代理(proxy) """ 1.启动代理服务器Heroku,相当于aliyun 2.在主机1080端口启动Socks 服务 3.将请求转发到1080端口 4.获取相应资源 首先要安装包pip install 'requests[socksv5]' """ import requests #定义一个代理服务器,所有的http及https都走socks5的协议,sock5相当于http协议,它是在会话层 #把它转到本机的

  • Python图像处理之识别图像中的文字(实例讲解)

    ①安装PIL:pip install Pillow(之前的博客中有写过) ②安装pytesser3:pip install pytesser3 ③安装pytesseract:pip install pytesseract ④安装autopy3: 先安装wheel:pip install wheel 下载autopy3-0.51.1-cp36-cp36m-win_amd64.whl[点击打开链接] 执行命令:pip install E:\360安全浏览器下载\autopy3-0.51.1-cp36

  • python模拟点击在ios中实现的实例讲解

    我们都知道因为操作系统的不同,很多游戏区分为安卓和苹果两个版本.那么之前学会python模拟点击的小伙伴开始担心,如果手机是ios版本那还能使用吗?这个问题小编进行了测试,小伙伴们完全不用忧虑ios版本,因为经过测试的结果是可以使用的.具体在ios中模拟点击使用的细节大家也可以看看了解一下. 代码示例 Python Version import socket import time # event types TOUCH_UP = 0 TOUCH_DOWN = 1 TOUCH_MOVE = 2

  • celery在python爬虫中定时操作实例讲解

    使用定时功能对于我们想要快速获取某个数据来说,是一个非常好的方法.这样我们就不用苦苦守在电脑屏幕前,只为蹲到某个想要的东西.在之前我们已经讲过time函数进行定时操作,这算是time函数的比较基础的一个用法了.其实定时功能同样可以用celery实现,具体的方法我们往下看: 爬虫由于其特殊性,可能需要定时做增量抓取,也可能需要定时做模拟登陆,以防止cookie过期,而celery恰恰就实现了定时任务的功能.在上述基础上,我们将`tasks.py`文件改成如下内容 from celery impor

  • python中if-elif-else语句实例用法讲解

    1.判断多个条件的语句,if为真则执行if后面的语句. 2.如果elif是真的,则执行elif,后面的代码块不执行. 3.如果if和elif不满意,执行else语句. 实例 if expression: statements... elif expression: statements... # 可以有1条或多条elif语句 else: statement... 知识点扩充: 有的时候,一个 if - else - 还不够用.比如,根据年龄的划分: 条件1:18岁或以上:adult 条件2:6岁

  • Python 模拟购物车的实例讲解

    1.功能简介 此程序模拟用户登陆商城后购买商品操作.可实现用户登陆.商品购买.历史消费记查询.余额和消费信息更新等功能.首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询. 2.实现方法 架构: 本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了.主要编写了六个函数: (1)login(name,password) 用户登陆函数,实现用户名和密码

随机推荐