继承 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('选择课程')

什么是继承
继承是一种建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类
-在Python中一个字累可以继承多个父类
-其他语言一个子类只可以继承一个父类
继承的作用是:减少代码的冗余

如何实现继承,
确认谁是子类,谁是父类,
在定义子类时,引用父类名字在括号内

确认谁是父类
先抽象,再继承
-抽取对象之间相似的部分,总结出类
-抽取类之间相似的部分,总结出父类

注意程序的执行时自上而下的,父类必须定义在子类的上方
-在继承的背景下,对象属性的查找顺序
1,先从对象自己本身查找
2,对象没有,再在对象子类名称空间查找
3,子类没有,再在父类名称空间查找,父类没有则报错

派生:
指的是子类继承父类的属性与方法,并且派生出自己独有的属性
如果子类的属性或方法与父类的相同,优先用子类

子类继承父类属性与方法,并且重用父类的属性与方法,需要重新写__init__内容,造成代码冗余

解决办法
1,利用直接应用父类名,接受参数传参
2,利用supper函数,直接调用得到一个对象指向父类的名称空间

注意:不要混合使用

经典类与新式类:
新式类:
1,凡是继承object的类或子孙类都是新式类
2,在python3中所有的类都是新式类

经典类

1,在python2中才会有经典类与新式类之分
2,在python2中凡是没有继承object的都是经典类

调用mro返回的是一个继承序列:
super 的继承顺序严格遵循mro继承序列

在python3中提供了一个查找新式类查找顺序的内置方法
mro()会把当前类的继承关系列出来

多继承情况下造成“钻石继承”
mro的查找顺序是:
-新式类:
-广度优先
-经典类:
-深度优先

"""

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()