python_继承
2016-07-17 12:49
453 查看
继承
1、super 并不是一个函数,是一个类名,形如 super(B, self) 事实上调用了 super 类的初始化函数,产生了一个 super 对象
2、在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)
3、Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
只调用一次(如果每个类都使用super)
4、super(B, self).func的调用并不是用于调用当前类的父类的func函数(mro中下一个类的func)
5、mro中记录了一个类的所有基类的类类型序列。(如: F E B C D A object)
抽象基类
多重继承
经典类:
![](http://s4.51cto.com/wyfs02/M01/84/44/wKiom1eLC9qSEhzKAAEyRFLYpxw541.jpg)
执行的结果:p1-foo
p2-bar
从上面经典类的输出结果来看,实例d调用foo()时,搜索顺序是 D => C1 => P1,实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2
总结:经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。
[b](换句话说:子类只会调用第一个被继承的类的__init__)[/b]
新式类:
C2-bar从上面新式类的输出结果来看,实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1实例d调用bar()时,搜索顺序是 D => C1 => C2总结:新式类的搜索方式是采用“广度优先”的方式去查找属性。
Mix-in
貌似是一种方法,父类取消之间的依赖关系,化为平级关系,子类继承所有父类,顺序自己排
class Root(object): def __init__(self): print 'this is Root' class B(Root): def __init__(self): print 'enter B' super(B, self).__init__() print 'leave B'
1、super 并不是一个函数,是一个类名,形如 super(B, self) 事实上调用了 super 类的初始化函数,产生了一个 super 对象
2、在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)
3、Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
只调用一次(如果每个类都使用super)
4、super(B, self).func的调用并不是用于调用当前类的父类的func函数(mro中下一个类的func)
5、mro中记录了一个类的所有基类的类类型序列。(如: F E B C D A object)
抽象基类
from abc import ABCMeta, abstractmethod #导包 #抽象类 class Headers(object): __metaclass__ = ABCMeta #表示抽象类 def __init__(self): self.headers = '' @abstractmethod #定义抽象函数 def _getBaiduHeaders(self):pass def __str__(self): return str(self.headers) def __repr__(self): return repr(self.headers) #实现类 class BaiduHeaders(Headers): def __init__(self, url, username, password): self.url = url self.headers = self._getBaiduHeaders(username, password) def _getBaiduHeaders(self, username, password): client = GLOBAL_SUDS_CLIENT.Client(self.url) headers = client.factory.create('ns0:AuthHeader') headers.username = username headers.password = password headers.token = _baidu_headers['token'] return headers
多重继承
经典类:
![](http://s4.51cto.com/wyfs02/M01/84/44/wKiom1eLC9qSEhzKAAEyRFLYpxw541.jpg)
#! /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中找到该方法,查找结束。
[b](换句话说:子类只会调用第一个被继承的类的__init__)[/b]
新式类:
#! /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总结:新式类的搜索方式是采用“广度优先”的方式去查找属性。
Mix-in
貌似是一种方法,父类取消之间的依赖关系,化为平级关系,子类继承所有父类,顺序自己排
相关文章推荐
- 模拟xcopy的函数
- python中的map、filter、reduce函数
- python linecache模块读取文件的方法
- python_类属性和实例属性
- Python_实例方法、类方法、静态方法
- python_类方法
- 【转】Python Anaconda简介及安装
- py,pyc,pyo的区别
- pip 升级包 技巧 一键升级
- win10 安装 Python 和 pip 详解
- Ubuntu-14.04. sh .py腳本双击無法執行问题的解决方法
- ElementTree排序问题
- python学习笔记
- Python第一天
- 计划doing.....
- Python调用Linux c库:ctypes初学体验
- Python_基础_01
- Python_基本命令_01
- python_编码
- Python yield