• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

竹千代

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

多继承

python中支持多继承。当用派生类对象调用函数时,如果派生类有定义该函数,那么它就覆盖基类中的函数

class X(object):
    def __init__(self):
        print('X')

class Z(X):
    def __init__(self):
        print("Z")

>> z = Z()    # 派生类__init__覆盖了基类的__init__
>> Z

 

如果想调用到基类被覆盖的函数,那么应该通过显示调用

class X(object):
    def __init__(self):
        print('X')

class Z(X):
    def __init__(self):
        super().__init__()  # 对于python 2.x,super(Z, self).__init__()
        print("Z")

>> z = Z()
>> X
   Z

 

super()是访问到基类的关键,那么如何理解super()?

super是沿着最初始调用类的MRO链执行调用的。也就是说,super()第一次调用,是取到MRO链中第一个元素;第二次调用,第二个

class X(object):
   def __init__(self, a):
       print('--X')
       super().__init__(2)
       print('X--')
   def hello(self, a):
        pass

class Y(object):
   def __init__(self, a):
       print('--Y')
       super().__init__()
       print('Y--')

class Z(X, Y):
   def __init__(self, a):
       print('--Z')
       super().__init__(a)
       print('Z--')

print(Z.__mro__)
z = Z(1)

>> (<class '__main__.Z'>, <class '__main__.X'>, <class '__main__.Y'>,<class 'object'>)
>> --Z
>> --X
>> --Y
>> Y--
>> X--
>> Z--

由上可知,在Z中调用super(),得到是X;然后在X中super(),得到是Y;在Y中调用super(),得到是object

需要注意的是:这种多继承MRO链式调用,适用于调用函数的参数形式一致(或者没有参数,如close、get类函数)的情况。

 

参考: http://www.artima.com/weblogs/viewpost.jsp?thread=281127

posted on 2015-09-19 09:31  竹千代  阅读(166)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3