多继承

| 标签 multiinheritance  浏览次数: -

经典类

  • 没有显示的继承 object 这个类,在python3中就只有新式类了
  • 深度优先搜索
  • 对于@property属性值可以进行重新修改

新式类

  • 显示的继承 object 这个类
  • 广度优先搜索
  • __mro__

    新式类才有的属性,显示类方法查找顺序

  • 对于@property属性值不能进行修改,否则会报AttributeError: can't set attribute错误

注意

  • 多继承时注意类的继续顺序,如果类B没有name属性,但在多继承时,AB前面Aname 属性,所有B也就有了。
class C(A, B):
    pass

示例代码

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


# class A(object):
class A:
    def __init__(self):
        print "init A"

    @property
    def name(self):
        return "A"

    def foo(self):
        print "A Foo"


# class B(object):
class B:
    def __init__(self):
        print "init B"

    @property
    def name1(self):
        # 虽然类 B 没有name 属性,但在多继承时, A在B的前面, A 有 name 属性,所有 B也就有了
        if hasattr(self, "name"):
            print "B 有 name 属性"
        else:
            print "B 没有 name 属性"
        return self.name

    def foo(self):
        print "B Foo"

    def bar(self):
        print "B Bar"


class C1(A, B):
    def __init__(self):
        print "init C1"
        # super(C, self).__init__()
        # A.__init__(self)
        B.__init__(self)

    def get_name(self):
        print self.name1


class C2(A, B):
    def __init__(self):
        print "init C2"
        # super(C, self).__init__()
        # A.__init__(self)
        B.__init__(self)

    def get_name(self):
        print self.name1

    def bar(self):
        print "C2 Bar"


class D(C1, C2):
    pass


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

上一篇 log打印规范     下一篇 管理项目依赖
目录导航