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

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

2018-03-19 17:48 771 查看
若有帮助到你,记得点赞哦!
参考: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(
4000
self.sound)

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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐