Python类的继承,你了解多少?
“三人行必有我师焉!”、“不耻下问”,中国的圣人先师孔子留下的文化瑰宝传承在生活中的每个角落。
孔子是中国古代最伟大的思想家、教育家。如果说中国有一种根本的立国精神,能够历久不变,能够浸润于全民族的生命之中,又能够表现中华民族独特的伦理价值的话,无疑是孔子开创的儒家思想。
这就是文化的传承。我们Python编程也有这种传承即继承。
继承
面向对象三大特征:封装、继承、多态
面向对象编程 (OOP) 语言的一个主要功能就是“继承”,所谓继承就是使现有的类无需编码便可以拥有原有类的方法和属性。
被继承的类可以称之为父类、基类、超类。继承的类可以称之为子类、派生类。派生和继承是一体两面,从父类向子类看就是派生,从子类向父类看就是继承。子类和父类的关系可以用“is a”类表示,即子类是父类的一种,是一个更具体、更加强大的父类。python支持单继承和多继承。

上图中我们把【动物】看成父类而【人】和【猪】就是它的子类。或者人类也可以有子类。

单继承
在开始给大家介绍编程之前,首先给需要大家了解,在Python中所有的类默认继承object。也就是说如果你定义一个Person类,则默认会继承object。
继承的格式:
class 父类名: # 默认继承object,但是都是省略了object
......
class 子类名(父类名):
....
# 没有继承的时候classPerson:def__init__(self, name):
self.name = name
self.age = 18defeat(self):
print(self.name + "正在吃饭...")
classStudent:def__init__(self, name):
self.name = name
self.age = 18defeat(self):
print(self.name + "正在吃饭...")
defstudy(self):
print('我要好好学习!')
classProgramer:def__init__(self, name):
self.name = name
self.age = 18defeat(self):
print(self.name + "正在吃饭...")
defprogram(self):
print('编写程序中...')
但是我们发现三个类中有很多相同的代码,这时候就成了代码冗余。此时我们就需要通过继承解决问题。
将每个类中冗余的代码提取到父类中,然后子类继承父类的就可以了。
我们按照上面继承的格式“改装”代码如下:
classPerson:def__init__(self, name):
self.name = name
self.age = 18defeat(self):
print(self.name + "正在吃饭...")
classStudent(Person): defstudy(self):
print('我要好好学习!')
classProgramer:defprogram(self):
print('编写程序中...')
此时代码是不是就变得很简练了,可以创建一个Student对象或者Programer对象,调用一下eat方法看看是否有打印。
构造方法的继承
我们在上面的代码基础上,创建一个Student对象。
s = Student('大宝')
s.eat()
s.study()
但是此时我们想在学生对象创建的时候就初始化一个学生的班级,我们如何实现呢?
父类__init__调用方式:
super(当前类名,self)._init_(实参列表)
super()._init_(实参列表)
父类名._init_(self,其它参数)
classPerson:def__init__(self, name):
self.name = name
self.age = 18defeat(self):
print(self.name + "正在吃饭...")
classStudent(Person): def__init__(self,name,clazz):
# 调用父类的构造方法(3种实现方式)# super(Student,self).__init__(name)# super().__init__(name)
Person.__init__(self,name)
self.clazz = clazz
defstudy(self):
print(f'我在{self.clazz},我要好好学习!')
s = Student('大宝','一年级3班')
print(s)
s.eat()
s.study()
print(s.age)
方法的重写
有的时候从父类继承的方法在子类往往不能满足需求,则需要在自己的类中定义一个同名的方法,那这种操作我们称作重写。
比如父类Person中的eat方法不能满足子类Student的需求了,此时就需要在Student中重写此方法,代码如下:
classStudent(Person):def__init__(self,name,clazz):
super().__init__(name)
self.clazz = clazz
defstudy(self):
print(f'我在{self.clazz},我要好好学习!')
# 重写eat方法defeat(self,food):# 此时可以调用父类原有的方法通过关键字super,然后再添加自己的代码
super().eat()
print(f'{self.name}最喜欢的食物是:{food}')
# 创建对象
s = Student('大宝','一年级3班')
s.eat()
结果:
大宝正在吃饭...
大宝最喜欢的食物是:汉堡
大家发现打印结果是重写后的eat方法,所以大家记住一点:对象在调用的时候先判断当前类是否存在此方法,如果存在调用自己的,不存在去父类找,如果父类都没有则报错。
继承注意事项:
并不是所有的都可以继承哦!私有的是继承不了的。即父类的私有属性和私有方法是无法继承的。
Python中的**super()**方法设计目的是用来解决多继承时父类的查找问题,所以在单继承中用不用 super 都没关系;但是,使用 super() 是一个好的习惯。一般我们在子类中需要调用父类的方法时才会这么用。
super()的好处就是可以避免直接使用父类的名字.主要用于多重继承
classA:defm(self):
print('A')
classB:defm(self):
print('B')
classC(A):defm(self):
print('C')
super().m()
c = C()
c.m()
这样做的好处就是:如果你要改变子类继承的父类(由A改为B),你只需要修改一行代码(class C(A): -> class C(B))即可,而不需要在class C的大量代码中去查找、修改基类名,另外一方面代码的可移植性和重用性也更高。
多继承
所谓多继承就是一个子类可以继承多个父类。格式:
class 父类A:
......
class 父类B:
......
class 子类名(父类A,父类B,..): # 即可以通过逗号分隔跟多个父类
....
classA:defm(self):
print('A')
classB:defm(self):
print('B')
classC:defprint_c(self):
print('CCC')
classD(A,B,C):defm(self):
print('D')
super().m()
d = D()
d.m()
d.print_c()
结果:
D
A
CCC
当对象d调用m()函数的时候,为什么?因为首先在当前类搜索是否存在m函数,如果存在则打印结果,不存在则去父类找。那super().m()调用的时候搜索父类的顺序是什么呢?是按照继承时括号里面父类的顺序依次查找是否存在,所以先判断A类是否有m函数,有则调用,没有继续向下查找。
当然也可以通过调用:类名.__mro__来查看查找m的顺序。
print(D.__mro__)
结果:
(<class'main.D'>, <class'main.A'>, <class'main.B'>, <class'main.C'>, <class'object'>)
但是如果我们把代码改成如下:
classA:defm(self):
print('A')
classB:defm(self):
print('B')
classC(A,B):defprint_c(self):
print('CCC')
classD:defm(self):
print('D')
classE(C,D):defm(self):
print(E)
super().m()
print(E.__mro__)
打印结果是什么呢?自己敲代码分析实现一下。
Python类的继承,你了解多少?的更多相关文章
- Python类的继承(进阶5)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411918.html 本文出自:[Edwin博客园] Python类的继承(进阶5) 1. python中什 ...
- 孤荷凌寒自学python第二十二天python类的继承
孤荷凌寒自学python第二十二天python类的继承 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中定义的类可以继承自其它类,所谓继承的概念,我的理解 是,就是一个类B继承自 ...
- python 类定义 继承
0 前言 系统:win7 64bit IDE : python(x,y) 2.7.6.1 IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) ...
- 记录Python类与继承的一个错误
今天在学python的类与继承的时候遇到一个错误,原来是自己在ctrl+c ctrl+v的时候漏了一个括号 class Car(): def __init__(self,make,year,mode ...
- Python 类的继承__init__() takes exactly 3 arguments (1 given)
类(class),可以继承基类以便形成具有自己独特属性的类,我们在面向对象的编程中,经常用到类及其继承,可以说没有什么不是类的,今天我们就来详细探讨一下在python中,类的继承是如何做的. 我们假设 ...
- day30 python类的继承,抽象类等
Python之路,Day17 = Python基础17-面向对象入门 继承 class Student(People): pass print(Student.__bases__) # 查看 Stud ...
- python类、继承
Python 是一种面向对象的编程语言.Python 中的几乎所有东西都是对象,拥有属性和方法.类(Class)类似对象构造函数,或者是用于创建对象的"蓝图". 一.python ...
- python类的继承和多态,获取对象信息
继承 类的继承机制使得子类可以继承父类中定义的方法,拥有父类的财产,比如有一个Animal的类作为父类,它有一个eat方法: class Animal(object): def __init__(se ...
- python类的继承、多继承及其常用魔术方法
继承 一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法.属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就 ...
- python类的继承
继承一个类 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init__(self ...
随机推荐
- C# NN算法实现
NN算法的核心是,欧式距离(Euclid),在分类的数据中,找到与目标数据欧式距离最近的点,把目标点分类到其类,算法很简单,下面是C#代码的实现: namespace LocationService. ...
- ULR1 B. 【ULR #1】光伏元件
一个n∗nn∗n的0101矩阵ai,jai,j,有些位置可以修改,代价为ci,jci,j.要求进行一些修改之后满足:设clicli为第ii行的11的个数,cricri为第ii列的11的个数,要求cli ...
- 解决vue 移动端项目“切换页面,页面置顶”后报错为:"TypeError: Cannot set property 'scrollTop' of null"
参考原代码链接:https://www.cnblogs.com/wayneliu007/p/11932204.html 报错截图: 解决方法: 导入的getScrollParent为真返回的null ...
- uiautomator2 常用方法
常用功能方法的整理和总结 导入 import uiautomator2 as u2 连接ADB设备: 可以通过USB或Wifi与ADB设备进行连接,进而调用Uiautomator2框架,支持同时连接单 ...
- Hackintool查看CFG锁显示空白
Hackintool是黑苹果配置的得力工具,通过在Hackintool > 工具 > 从AppleIntelInfo中获取 可以看到cfg是否成功解锁.但是如果点击该按钮后输入密码执行CP ...
- LeetCode系列之 (JavaScript) => 53. 最大子数组和
题目描述: leetcode 题目链接: 53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com) 解题思路分析: 题干最终的输出是连续子数组的最大和:1. 贪心算法: ...
- Mybatis配置报错:Failed to configure a DataSource: 'url' attribute is not specified and no embe...
问题分析及解决方案 问题原因: Mybatis没有找到合适的加载类,其实是大部分spring - datasource - url没有加载成功,分析原因如下所示. DataSourceAutoConf ...
- leetcode之——二分法模板
class Solution: def search(self, nums: List[int], target: int) -> int: n=len(nums) left,right=0,n ...
- ssh 修改端口号 --centos 7
1 vim /etc/ssh/sshd_config Port XXXXX #XXXXX 为要修改的端口号,默认是22,直接在新的行添加Port XXXXX即可. 2 systemctl re ...
- Cubemx 生成工程代码失败的原因
折腾了好久(躺)翻了很多解答试了试终于捣鼓正常了,就在这里汇总一下看到过的问题 1.文件名.工程名或者工程文件路径/库路径上有中文名 2.Cubemx的版本过高 3.java环境的版本不适配 4.可能 ...