多继承
在python中,是支持一个类继承拥有多个父类的,更加导致了这门语言的强大性,但也是要控制好,注意一些特殊情况。
#coding=UTF8
class School(object):
"""docstring for School"""
def __init__(self):
print ('School __init__')
super(School, self).__init__()
self.schoolName = '南昌大学'
def getSchool(self):
if hasattr(self, 'schoolName'):
print (self.schoolName)
else:
print ('not schoolName attribute')
def run(self):
print ('school run')
class ClassInfo(object):
"""docstring for ClassInfo"""
def __init__(self):
print ('ClassInfo __init__')
super (ClassInfo, self).__init__()
self.className = '12软件'
def getClassName(self):
if hasattr(self, 'className'):
print (self.className)
else:
print ('not className attribute')
def run(self):
print ('class run')
class Student(ClassInfo, School): # 继承两个父类,可以看到子类实现了__init__后,所有父类的__init__都不会被调用
# def __init__(self): # 如果这里不实现初始化方法,你会发现,这个子类所继承的父类,每个都各自调用了自己的__init__
pass
s = Student()
s.run() # 可以看到run()方法执行的是第一个被继承的ClassInfo父类,所以遇到同名函数时,会先在子类找,找不到就在第一个继承的父类里找,依次类推
'''
你会发现报错,AttributeError: 'Student' object has no attribute 'className'
提示没有发现className 属性。。。我擦
原因:Student类自己实现了__init__方法,根本没执行过ClassInfo的__init__,所以就没有绑定className属性,直接使用不存在的属性肯定报错
解决方案:就是搞一个属性是否存在判断,别因为继承让程序瞎几把崩溃了
也就是从这一侧面反映出,我们写python是要多么的小心和谨慎,要习惯为很多错误因素考虑并处理
'''
s.getClassName()
s.getSchool()
# 现在通过子类往父类注射属性进行绑定设值,就不会报错了
s.className = '小泉一班'
s.schoolName = '清华'
s.getClassName()
s.getSchool()
'''
运行结果:
ClassInfo __init__
School __init__
class run
12软件
南昌大学
小泉一班
清华
'''