python多继承(新式类)一
最近在学习python的多重继承。
先来了解下多重继承的概念,所谓多重继承,是指python的类可以有两个以上父类,也即有类A,类B,类C,C同时继承类A与类B,此时C中可以使用A与B中的属性与方法。那么问题来了,如果A与B中具有相同名字的方法,这个时候python怎么调用的会是哪个方法呢?
举个例子:
class A(object):
def __init__(self):
pass
def foo(self):
print 'A foo'
class B(object):
def __init__(self):
pass
def foo(self):
print 'B foo'
class C(A,B):
def __init__(self):
pass
testc = C()
testc.foo()
实际上打印出来的信息是 A foo,这就说明了调用的是A中的方法。其实在python2.2之后,多继承中基类的寻找顺序是一种广度优先算法,称之为C3的算法(后续博客我会简单介绍下C3算法)。而python2.2之前,使用的是深度优先算法来寻找基类方法。在类C的继承关系中,按照广度优先算法,则会先找到靠近C的基类A,在A中找到foo方法之后,就直接返回了,因此即使后面的基类B中也有foo方法,但是这里不会引用它。
更加清晰的多继承例子:
class A(object):
def foo(self):
print 'A foo' class B(object):
def foo(self):
print 'B foo'
def bar(self):
print 'B bar' class C1(A,B):
pass class C2(A,B):
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__.A'>, <class '__main__.B'>, <type 'object'>)
A foo (实际上搜索顺序为D=>C1=>A)
C2 bar(实际上搜索顺序为D=>C1=>C2)
可以看到,foo找到的是A类中的方法,bar找到的是C2中的方法。
其实新式类的搜索方法是采用了“广度优先”的方式去查找属性。
只有新式类有__mro__属性,该属性标记了python继承层次中父类查找的顺序,python多重继承机制中就是按照__mro__的顺序进行查找,一旦找到对应属性,则查找马上返回。
经过上面的__mro__输出可以发现,D类的继承查找路径为:D=>C1=>C2=>A=>B=>object,通过该查找路径,foo方法将会调用A的foo方法,、bar方法将调用C2的方法,通过实际实验调用,查看输出内容确实与__mro__顺序一样。
python多继承(新式类)一的更多相关文章
- Python 多继承(新式类) 的mro算法
转载自:http://www.cnblogs.com/panyinghua/p/3283831.html mro即method resolution order,主要用于在多继承时判断调的属性的路径( ...
- Python之面向对象新式类和经典类
Python之面向对象新式类和经典类 新式类和经典类的继承原理: 在Python3中,就只有新式类一种了. 先看Python3中新式类: 类是有继承顺序的: Python的类是可以继承多个类的,也就是 ...
- python(十四)新式类和旧式类
这里有个重要概念呢在下面那个链接 http://blog.csdn.net/zimou5581/article/details/53053775 http://www.cnblogs.com/btch ...
- Python - 面向对象编程 - 新式类和旧式类
object object 是 Python 为所有对象提供的父类,默认提供一些内置的属性.方法:可以使用 dir 方法查看 新式类 以 object 为父类的类,推荐使用 在 Python 3.x ...
- Python基础:新式类的属性访问
一.概述 二.准备工作 1.讨论对象 2.名词解释 三.实例绑定的属性访问 1.获取属性 一般规则 参考源码 示例验证 2.设置属性 一般规则 参考源码 示例验证 3.删除属性 一般规则 参考源码 示 ...
- python中的新式类与旧式类
在python2中,有新式类与旧式类的区别: 首先创建一个类: class Sb(object): pass 如果创建时继承自object,说明这是一个新式类,不写object,说明是一个旧式类: 那 ...
- python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。
单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object): d ...
- 多任务-python实现-继承Thread类,单独编写一个类(2.1.2)
@ 目录 1.thread类 1.thread类 threding代码实现 import threading import time class MyThread(threading.Thread): ...
- 【python】-- 类的多继承、经典类、新式类
继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...
- 洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类
经典类 1.什么是经典类 就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不 ...
随机推荐
- app专项测试(稳定性测试、安全性测试)
https://blog.csdn.net/xiaomaoxiao336368/article/details/84887948
- css动画和渐变
变形: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元素的变形:transform transform:none | <tra ...
- 杂项-协议-HTTP:GET/POST/PUT/DELETE/INPUT/TRACE/OPTIONS/HEAD方法
ylbtech-杂项-协议-HTTP:GET/POST/PUT/DELETE/INPUT/TRACE/OPTIONS/HEAD方法 1.返回顶部 1. 请求方法是请求一定的Web页面的程序或用于特定的 ...
- 第三课 go语言基础语法
http://www.runoob.com/go/go-basic-syntax.html 1 行分隔符 在 Go 程序中,一行代表一个语句结束.每个语句不需要像 C 家族中的其它语言一样以分号 ; ...
- Python-编写一个mysql注入漏洞检测工具
判断mysql网站是否存在注入漏洞的几个方法: 注入点后加上一个单引号会报错 and 1=1返回正常页面,and 1=2返回的页面不同于正常页面 and sleep(3) 网页会等待3秒左右 根据返回 ...
- inner join ,left join ,right join区别
inner join ,left join ,right join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中 ...
- Android M AudioPolicy 分析
1.AudioPolicyService基础 AudioPolicy在Android系统中主要负责Audio"策略"相关的问题.它和AudioFlinger一起组成了Android ...
- Matlab常用函数(1)
1.max() C = max(A) A为向量,返回最大值.若为矩阵,以类向量为基准,返回每列的最大值的行向量.若为多维矩阵.切片返回每一个2维矩阵的行向 量. C = max(A,B) ...
- 【总结整理】javascript的函数调用时是否加括号
javascript的函数调用时是否加括号 if(event.preventDefault){ event.preventDefault(); if判断条件里面不要加括号,不加括号是应该以属性形式,i ...
- adb devices unauthorized解决方法
有时候使用adb连接手机时,即使打开了usb调试,手机添加了信任,仍然出现unauthorized的提示 解决办法如下: 先上两张stack overflow上面的图片: 很多人可能看不懂.翻一下大概 ...