您的位置:首页 > 编程语言 > Python开发

python_继承

2016-07-17 12:49 453 查看
继承
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


多重继承

经典类:



#! /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

貌似是一种方法,父类取消之间的依赖关系,化为平级关系,子类继承所有父类,顺序自己排
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  py