什么是继承
继承是一种建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类
-在Python中一个字累可以继承多个父类
-其他语言一个子类只可以继承一个父类
继承的作用是:减少代码的冗余
如何实现继承,
确认谁是子类,谁是父类,
在定义子类时,引用父类名字在括号内
确认谁是父类
先抽象,再继承
-抽取对象之间相似的部分,总结出类
-抽取类之间相似的部分,总结出父类
注意程序的执行时自上而下的,父类必须定义在子类的上方
-在继承的背景下,对象属性的查找顺序
1,先从对象自己本身查找
2,对象没有,再在对象子类名称空间查找
3,子类没有,再在父类名称空间查找,父类没有则报错
派生:
指的是子类继承父类的属性与方法,并且派生出自己独有的属性
如果子类的属性或方法与父类的相同,优先用子类
子类继承父类属性与方法,并且重用父类的属性与方法,需要重新写__init__内容,造成代码冗余
解决办法
1,利用直接应用父类名,接受参数传参
2,利用supper函数,直接调用得到一个对象指向父类的名称空间
注意:不要混合使用
经典类与新式类:
新式类:
1,凡是继承object的类或子孙类都是新式类
2,在python3中所有的类都是新式类
经典类
1,在python2中才会有经典类与新式类之分
2,在python2中凡是没有继承object的都是经典类
调用mro返回的是一个继承序列:
super 的继承顺序严格遵循mro继承序列
在python3中提供了一个查找新式类查找顺序的内置方法
mro()会把当前类的继承关系列出来
多继承情况下造成“钻石继承”
mro的查找顺序是:
-新式类:
-广度优先
-经典类:
-深度优先
"""
class Oldteacher:
school = 'oldboy'
country = 'china'
def init(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def change_source(self):
print('更改分数')
class Oldstudent:
school = 'oldboy'
country = 'china'
def init(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def choice_class(self):
print('选择课程')
class OldPeople:
school='school'
country ='china'
def init(self,name,sex,age):
self.name= name
self.sex = sex
self.age = age
class Oldteacher(OldPeople):
def init(self,name,sex,age,sal):
# self.name= name
# self.sex = sex
# self.age = age
OldPeople.init(self,name,sex,age)
self.sal = sal
def change_source(self):
print('更改分数')
class Oldstudent(OldPeople):
def init(self,name,sex,age,like):
# self.name= name
# self.sex = sex
# self.age = age
super().init(name,sex,age)
self.like = like
def choice_class(self):
print('选择课程')
stu1 =Oldstudent('张三','男',18)
print(stu1.country)
class foo:
def f1(self):
print('foo,f1')
def f2(self):
print('foo,f2')
self.f1()
class goo(foo):
def f1(self):
print('goo ,f1')
def func(self):
print('goo,func')
cae_obj=goo()
print('11')
cae_obj.f2()