子类重写父类方法|学习笔记

简介: 快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。

开发者学堂课程【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)

 

相关文章
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
4月前
|
Java
子类的父类和接口具有共同的方法
子类的父类和接口具有共同的方法
33 7
为什么子类会调用父类无参的构造函数
为什么子类会调用父类无参的构造函数
类的继承和重写方法
类的继承和重写方法
71 0
子类到底能不能继承父类的私有属性?
继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体;子类通过继承父类的属性的行为,我们称之为继承。Java只支持单继承,不支持多继承。因为多继承容易带来安全隐患:当多个父类定义相同的功能,当功能内容不同的时候,子类对象不确定要运行哪一个,在Java中用另一种形式体现出来,就是接口的多实现。
ES6—45:子类对父类方法的重写
ES6—45:子类对父类方法的重写
155 0
ES6—45:子类对父类方法的重写
|
Java C++
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(二)
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(二)
215 0
|
Java C++
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
2325 0
|
Python
8.4 类的重写
子类除了继承父类的所有属性和方法,还可以自定义自己的属性和方法,增加了代码的复用性 class parent(object):     name='parent'     sex='F'     def __init__(self):         print('my name is {0}'.
645 0