Python入门学习
DAY24
今日内容: 继承
继承
1.什么是继承
继承就是新建类的一种方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类
python中继承的特点:
①子类可以继承/重用父类的属性
②一个子类可以同时继承多个父类
③在继承的背景下,python中的类又可以分为:经典类 新式类
新式类:即继承了object的类,以及该类的子类等等,都为新式类
在python3中一个类即是没有显示的继承任何类,默认就会继承object,
所以在python3都是新式类,没有经典类
经典类:没有继承object的类,以及该类的子类等等,都为经典类
在python2中才区分新式类与经典类,
在python2中一个类如果没有显式地继承任何类,也不会继承object
2.为什么要使用继承
为了减少类与类之间的代码冗余
3.如何用继承
如何减少代码冗余
列:有如下两个类,我们可以发现2个类又很多相似的代码,造成了代码冗余,因此我们可以定义一个父类解决这个问题
class Student():
def __init__(self, name, age, sex, score=0):
self.name = name
self.age = age
self.sex = sex
self.score = score
def choose_course(self):
print('%s choosing course' % self.name)
class Teacher():
def __init__(self,name,age,sex,level):
self.name=name
self.age=age
self.sex=sex
self.level=level
def score(self,stu,num):
stu.score=num
解决方案:
class People:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Student(People):
def choose_course(self):
print('%s choosing course' % self.name)
class Teacher(People):
def score(self,stu,num):
stu.score=num
但是我们发现每一个类又有自己不同的属性要加,student 要加入score属性,teacher 要加入level属性
因此我们需要重用父类的属性,有两个方法
在子类派生出的新方法中重用父类功能的方式一:指名道姓地引用某一个类中的函数
列:其中使用代码People.__init__(self,name,age,sex)
class People:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Student(People):
def __init__(self, name, age, sex, score=0):
People.__init__(self,name,age,sex)
self.score = score
def choose_course(self):
print('%s choosing course' % self.name)
class Teacher(People):
def __init__(self,name,age,sex,level):
People.__init__(self,name,age,sex)
self.level=level
def score(self,stu,num):
stu.score=num
方式一总结:
1. 与继承无关(因为相对于只是调用了类的一个功能)
2. 访问是类的函数,没有自动传值的效果
在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
在python2中:super(自己的类名,自己的对象)
在python3中:super()
python专门为新式类内置了一个mro的方法,用来查看方法解析顺序
调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,注意:完全参照mro列表
列:使用super()内置方法解决该问题
class People:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Student(People):
def __init__(self, name, age, sex, score=0):
super().__init__(name,age,sex)
self.score = score
def choose_course(self):
print('%s choosing course' % self.name)
class Teacher(People):
def __init__(self,name,age,sex,level):
super().__init__(name,age,sex)
self.level=level
def score(self,stu,num):
stu.score=num
方式二总结:
1. 严格依赖继承的mro列表
2. 访问是绑定方法,有自动传值的效果
以上为本次学习内容