python入门:类的多重继承问题、重写、未绑定的超类方法、super()



若有帮助到你,记得点赞哦!

参考:python基础教程第二版 Hetland

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 19 15:18:20 2018

@author: Lelouch_C.C
"""
#类的多重继承问题
class A1:
    def hello(self):
        print('Hello,A1!')
class A2:
    def hello(self):
        print('Hello,A2!')
class B1(A1,A2):           #指定B1的继承(A1优先于A2,若A1,A2有同名方法,A2方法将被A1方法重写)
    pass
class B2(A2,A1):           #同上
    pass    

if __name__=='__main__':
    print(A1().hello())
    print(A2().hello())
    print(B1().hello())
    print(B2().hello())
    """
    输出:
    Hello,A1!
    None                  #由于没有设置返回值,所以返回值为None
    Hello,A2!
    None
    Hello,A1              #可以看出,多重继承中,顺序非常重要,前优先于后
    None
    Hello,A2!             #同上
    None
    """
    
#重写
class B(A1,A2):
    def hello(self):
        print('Hello,B!')
b=B()

if __name__=='__main__':
    print(b.hello())
    """
    输出:
    Hello,B!              #我明明是B,为什么要"Hello,A1",所以要重写
    None                  
    #另外,若调用B类下某个方法,首先在B类下寻找,若找不到,接着在指定的超类中寻找。
    """
"""
但是重写__init__方法是会遇到问题
"""
class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print('Aaaa...')
            self.hungry=False
        else:
            print('No,thanks!')
"""
class songBird(Bird):
    def __init__(self):
        self.sound='Squawk'
    def sing(self):
        print(self.sound)
sb=songBird()
print(sb.sing())
"""
"""
输出:
Squawk
None
"""
#print(sb.eat())
"""
报错:
AttributeError: 'songBird' object has no attribute 'hungry'
#原因很明显,__init__被改写后,eat()下无self.hungry参数。
"""
#调用未绑定的超类方法
"""
class songBird(Bird):
    def __init__(self):
        Bird.__init__(self)
        self.sound='Squawk'
    def sing(self):
        print(self.sound)

sb=songBird()
print(sb.sing())
"""
"""
输出:
Squawk
None
"""
#print(sb.eat())
"""
输出:
Aaaa...
None
"""
#print(sb.eat())
"""
输出:
No,thanks!
None
"""
#使用super(),super() 函是用于调用父类(超类)的一个方法,不仅仅用于__init__
#super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,
#但是如果使用多继承,会涉及到查找方法解析顺序(MRO)、重复调用(钻石继承)等种种问题。
#python3里不需要__meatclass__=type
class songBird(Bird):
    def __init__(self):
        super(songBird,self).__init__()
        #super()会查找所有的超类以及超类的超类,直到找到所需的方法为止
        #Python3.x 和 Python2.x 的一个区别是: 
        #Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
        self.sound='Squawk'
    def sing(self):
        print(self.sound)

sb=songBird()
print(sb.sing())
print(sb.eat())
print(sb.eat())
"""
输出:
Squawk
None
Aaaa...
None
No,thanks!
None
"""

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值