继承

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



多重继承


经典类:

python_继承_py

#! /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中找到该方法,查找结束。

(换句话说:子类只会调用第一个被继承的类的__init__)



新式类:

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


貌似是一种方法,父类取消之间的依赖关系,化为平级关系,子类继承所有父类,顺序自己排