开发者学堂课程【Python 入门 2020年版:子类重写父类方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10392
子类重写父类方法
内容简介
一、继承特点
二、调用父类的两种方式
一、继承特点
如果一个类 A继承自类 B,由类 A创建出来的实例对象都能直接使用类 B里的定义方法
输入代码:
class Person(object):
def__init__(self,name,age):
self.name=name
self.age=age
def sleep(self):
print(self.name+'正在睡觉')
class Student(Person):
pass
s =Student(‘jerry’,20)
//创建一个实例对象,此处必须有参数,因为在调时会先调用 Student的 init方法,如果没有就会调用父类 Person的 init方法,Person的 init方法这里需要两个参数
s.sleep()
运行一下,结果显示
jerry正在睡觉
注意 s =Student(‘jerry’,20)调用了父类的_init_方法
s.sleep()调用了父类的 sleep方法
但是也可以定义自己的方法,修改代码 pass为
def study(self):
print(self.name + ‘正在学习’)
现在我们注意到父类的 sleep方法和子类的 sleep方法实现一样,那有没有可能不一样的?不一样该如何操作呢?
比如现在要实现如果是学生,打印出的结果为学生正在课间睡觉
只需要重写,在正在学习的代码上方插入代码:
def sleep(self):
print(self.name+’正在课间休息时睡觉’)
//与父类的 sleep方法名一致,是将父类的 sleep进行重写
思考重写完之后再调 sleep是调用父类的还是子类的?调用自己的,之前讲解过 Student._mro_,mro属性就规定了调用哪个
运行一下,结果显示
jerry正在课间休息时睡觉
(,,)
可以看到 mro属性先调用自己的再调用父类的再调用 object
mro就是 method resolution order方法解决顺序
在写的时候其实存在两种情况:
1)子类的实现和父类的实现完全不一样,子类可以选择重写父类的方法。
但是不能直接删除掉父类的代码 def sleep(self):
print(self.name + ‘正在睡觉’)
例如当下方还存在 p想睡觉,就会被影响
p=Person(‘jack’,21)
p.sleep()
/子类的实现和父类的实现完全不一样,在子类定义一个同类的方法,把父类的方法覆盖掉,是在父类已经有的基础上加了一个新的属性
2)子类在父类的基础上又有更多的实现。/可以在子类的功能的基础上调一下父类的方法/
代码中其实调用了两个方法,init方法和 sleep方法
比如现在想要学生在创建时除了拥有名字年龄,再来添加上学校
在正在课间休息时睡觉的代码上方添加代码:
def__init__(self,name,age,school):
self.name=name
self.age=age
self.school = school
再在 s=Student中添加’春天花花幼稚园’的学校属性,jerry就会有学校的属性
之后我们观察到代码
self.name=name
self.age=age
与父类一致,还可以使用别的方法简单写,先注释掉,其实这就是子类在父类实现的基础上,又添加了自己新的功能
二、调用父类方法的两种方式
之后调用父类方法,调用父类方法有两种方式:
第一种:init方法中第一个参数 self是一个普通的对象方法,那么对象方法就可以通过 Person类名._init_()
Person.__init__方法与之前调用的方法类似相当于有代码:
p =Person(‘jack’,12)
Person.sleep(p) //想要调 person的 sleep方法,可以写 person.sleep,然后将 p传进去
而 init方法写为:
p=object.__new__(Person)
p.__init__('zhangsan',18)
但其实该方法可以使用实例方法来调,也可以使用类方法来调:
Person.__init__(p,'zhangsan',18)
init方法其实也是一个对象方法,跟 p.sleep()调用类似
调用 p.sleep()方法也可以写为 Person.sleep(p)
如果现在就是要在 Student的 init中调用一下 Person的 init方法,就可以直接写 Person._init_()
如果调用实例方法,需要手动给 self传参,self必须要写,self就相当于代码 Person._init_(p,’zhangsan’,18)传的是 p
综上,即父类名.方法名(self,参数列表)
Person.__init__(self,name,age)
第二种:
使用 super直接调用父类方法。推荐使用第二种方式。
super(Student,self).__init__(name,age)