[置顶] 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
"""
参考: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
"""
相关文章推荐
- python继承,调用未绑定的父类方法,super,多级继承
- python 27 super继承(解决多重继承时,老办法init父类多次的问题)
- python 继承 及调用被重写的父类方法(未被绑定的方法)
- Python多重继承引发的问题——牛逼的super
- python-对象、私有属性_方法、继承(多重继承)、重写
- python 27 super继承(解决多重继承时,老办法init父类多次的问题)
- OC第三天-继承,初始化方法,便利构造器 ,self,super,方法重写
- Python类的多重继承问题深入分析
- 关于继承时子类重写父类方法和覆盖父类变量的若干问题 (待进一步研究)
- 继承;成员变量隐藏与重写;关键字super;final类和final方法
- python继承中重载问题:私有函数不能被子类重写
- JAVA第七节-继承,继承中方法重写,继承的初始化顺序,final关键字,super关键字,object类
- 在继承中重写方法时抛出异常的问题
- [置顶] win10安装Python出现问题解决方法
- Scala学习第十二天 Scala中的继承:超类的构造、重写字段、重写方法代码实战
- Scala中的继承:超类的构造、重写字段、重写方法
- Python学习27:继承以及多重继承方式,MRO(方法解释顺序)
- JAVA菜鸟入门篇 - 面向对象三大特征之一:继承 ,方法重写(override)和Object类 (十四)
- java入门-成员变量的隐藏与方法重写(super)
- Scala 深入浅出实战经典 第12讲:Scala中的继承:超类的构造、重写字段、重写方法代码实战