Python继承

2021/6/21 周一
学习内容:父类、子类、方法重写、子类调用父类方法、super()函数、多继承

Python入门,主要是看 菜鸟教程、w3school 网站,以及电子工业出版社出版的Python编程入门指南上册的教材,并根据自己的情况对重点内容做的笔记。

如有错误,欢迎在评论区指出,非常感谢!


Python也支持类的继承,继承是面向对象编程的重要特性之一

当要编写的类和另一个已经存在的类之间存在一定继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。

父类是继承的类,也称为基类。任何类都可以是父类。

子类是从另一个类继承的类,也称为派生类。子类继承父类的所有方法和属性

1. 创建子类

比如说有一个父类Person类:

class Person:def __init__(self, fname, lname):self.firstname = fnameself.lastname = lnamedef printname(self):print(self.firstname, self.lastname)

要创建一个 Student 类来继承 Person 类,需要在创建子类时将父类作为类似参数的形式发送

class Student(Person):pass

(如果没想好子类需要什么其他属性或方法,可以先用 pass 关键字。)

这样就可以使用 Student 类来创建对象,并且调用它从 Person 类继承过来的 printname() 方法了:

x = Student("Hanne", "Lovegood")
x.printname()>>> 输出:
>>> Hanne Lovegood

2. 方法重写

上面的子类是直接继承了父类的属性和方法,如果父类中的方法不完全适用于子类,也可以在子类中重写父类的这个方法

比如 Student 重写 Person 的构造方法:

class Student(Person):def __init__(self, fname, lname):self.firstname = fname + ' _'self.lastname = lname

注意 lastname 属性虽然没有改变,但是不能省略,否则会报错 Student没有lastname 属性。

因为这两个属性都是写在父类的构造方法中的,如果子类有自己的构造方法了,就会覆盖掉父类的,也就没有继承到这两个属性了。

如果想要都继承到属性,不如把属性定义在方法外面,也就是作为类属性:

class Person:firstname = ''lastname = ''def __init__(self, fname, lname):self.firstname = fnameself.lastname = lname

这样即使子类重写了方法,也能继承到父类的这两个属性了。

3. 子类调用父类方法

或者想在继承父类构造方法的基础上,再做改动,可以用父类的类名先调用父类的构造方法:

class Student(Person):def __init__(self, fname, lname):Person.__init__(self, fname, lname)self.firstname = fname + ' _'x = Student("Hanne", "Lovegood")
x.printname()
>>> Hanne _ Lovegood

这样就是子类先从父类构造方法中获得了这两个属性,然后再修改 firstname 。

还可以使用 super() 函数来继承父类方法和属性,不用写父类的名称,也不用写第一个self参数

class Student(Person):def __init__(self, fname, lname):super().__init__(fname, lname)self.firstname = fname + ' _'

这样也是子类从父类继承了这两个属性,效果与使用上面使用Person.的一样。

4. 多继承

Python支持多继承。

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,后面的将被忽略

比如下面 Name 和 Age 中都有一个 prininfo() 方法:

class Name:def __init__(self, fname, lname):self.firstname = fnameself.lastname = lnamedef printinfo(self):print("My name is", self.firstname, self.lastname, ".")class Age():def __init__(self, age):self.age = agedef printinfo(self):print("I'm ", self.age)class Info(Name, Age):def __init__(self, fname, lname, age):Name.__init__(self, fname, lname)Age.__init__(self, age)print("Self Introduction:")x = Info("Hanne", "Lovegood", 23)
x.printinfo()>>> 输出:
>>> Self Introduction:
>>> My name is Hanne Lovegood .

从输出可以看出,只调用了 Name 的 printinfo() 方法,因为继承时 Name 写在 age 前面。

虽然Python支持多继承,但是尽量还是不要滥用,除了使代码变得复杂之外,一个一个地找父类的方法还会降低性能。

【Python】继承、父类、子类、方法重写、子类调用父类方法、super()函数、多继承相关推荐

  1. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  2. php protected 的继承,14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式...

    类的继承 简单理解: 某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息. 基本概念 ...

  3. 在jQuery方法中能调用JS方法吗?

    在jQuery方法中能调用JS方法吗? 能,在jQuery方法中直接写入要调用已写好的方法名()即可. 在项目中,有多个地方用到结账的功能. 比如, 点击结账按钮,由JS获取对应行列的数据,进行计算并 ...

  4. java 调用父类的变量_java创建子类对象设置并调用父类的变量操作

    通过子类调用父类的变量,有两种方法: 1.把父类的变量设置成public: package triangle.opengl.wlz.stu.childusefathervariable; import ...

  5. python多线程没有java_Java 多线程启动为什么调用 start() 方法而不是 run() 方法?...

    多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗? 在探讨这个问题之前,我们先来了解一些多线程的基础知识~ 线程的状态 Java ...

  6. 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...

     上章链接: 22.C++- 继承与组合,protected访问级别 继承方式 继承方式位于定义子类的":"后面,比如: class Line : public Object // ...

  7. 方法重写实例java,java方法重写实例分析

    本文实例讲述了java方法重写,分享给大家供大家参考.具体分析如下: 一.方法的重写概述: 1.在子类中可以根据需要对从基类中继承来的方法进行重写. 2.重写的方法和被重写的方法必须具有相同方法名称. ...

  8. php private方法,php如何调用private方法

    php调用private方法:首先定义一个parent类:然后在类的内部使用私有函数:接着实例化parent类,让其变成一个对象并赋值给"$obj"即可. 将一个类实例化后就变成对 ...

  9. java 反射 set方法_java 反射调用set方法

    Java语言中的许多库类名称,多与咖啡有关.下面是小编为您带来的java 反射调用set方法,希望对大家有所帮助. java 反射调用set方法: import java.beans.Property ...

  10. java方法定义 与调用_Java方法的定义及调用

    Java方法的定义及调用 通过以上内容的学习,可以看出方法是一段可以完成某个特定功能的并且可以被重复利用的代码片段.接下来我们来学习一下方法应该怎么定义以及怎么调用. 定义/声明方法的语法格式如下所示 ...

最新文章

  1. 心得丨一文告诉你想学数据分析该读什么书、从哪本读起
  2. 利用MSER算法提取图像区域(车牌区域)的OpenCV代码~
  3. Lucene第一篇【介绍Lucene、快速入门】
  4. 用MediaPlayer做个带进度条可后台的音乐播放器
  5. wxWidgets:wxPython 概述
  6. mPaaS 月度小报|为采购而生,全新资源包上架;前端 2D 游戏化互动入门指南
  7. MOCTF-Web-一道水题
  8. 【文末有福利】生成对抗网络
  9. Omni Recover for Mac版 - 一站式iPhone数据恢复
  10. 【Oracle】进阶知识进一步了解
  11. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_13使用骨架创建maven的web工程...
  12. python字典用法总结
  13. 场景文字检测——CTPN模型介绍及代码实现
  14. Windows 使用 CMD 命令行下载文件
  15. git查看状态和修改信息
  16. java最最基础知识(入门必备)
  17. 数据基础---《利用Python进行数据分析·第2版》第7章 数据清洗和准备
  18. 调用notify方法
  19. RobotStudio工作站的建立
  20. hInstance是什么参数

热门文章

  1. 自相关acf_高级自定义字段(ACF)入门
  2. Rockland丨Rockland抗寡核苷酸抗体开发流程
  3. 【一周读书】你的理想
  4. 大学计算机基础课程 研究,【计算机基础论文】大学计算机基础课程改革研究(共2493字)...
  5. GD32启动文件详解(同STM32)
  6. 《雷曼大冒险》之游戏的分析与设计
  7. X79 – E5 1650 黑苹果10.15
  8. Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)
  9. 『号外』Dynamo案例百解累积更新(2021.04)介绍~
  10. echarts loading加载页工具栏