Python基础面向对象之继承与派生详解
作者:Kkkkangsh 发布时间:2022-04-20 11:58:53
一、面向对象三大特征之继承
python三大特征:
封装、继承、多态
三者中继承最为核心,实际应用多,感受较为直观
封装和多态略微抽象
1、继承的概念
继承的含义:
在现实生活中,继承表示人与人之间资源的从属关系
例如:儿子继承父亲
在编程的世界中,继承表示类与类之间的资源从属关系
例如:类a继承类b
继承的目的:
在现实生活中,儿子继承了附件就拥有了父亲所有资源的支配权限
在编程世界中,类A继承了类B就拥有了类B中所有的数据和方法使用权限
2、继承的本质
继承本质应该分为两部分:
当多个类中含有相同部分时,我们就把相同的部分抽离出去,将相同的部分新成一个新的类,在用刚才被抽离出去相同部分的类,去继承新的那部分,这样的好处就是,当多个类需要一个相同用的功能时,可以节省代码,不用反复编写
抽象:将多个类相同的东西抽出去,形成一个新的类
继承:将多个类继承刚刚抽取出来的新的类
对象>>>:数据与功能的结合体
类(子类)>>>:多个对象相同功能和数据的结合体
父类>>>:多个子类相同功能和数据的结合体
本质:类、父类的本质都是为了节省代码,减少重复编写相同代码的时间,使用时更为方便
3、继承的实操
在定义类的时候,类名后方可加括号,早括号内填入其他它类的名字,就意味着继承了其它类
python支持多类继承,括号内可填写多个类名,只需用逗号隔开即可
# 1、定义两个类,其中一个假设为父类,另一个假设为子类
class Father:
money = 99999999
house = '老北京四合院' # 父类中数据强大
class Son:
pass # 子类中空空如也
# 2、父类中的数据,子类无权直接使用,当我们在子类中继承父类后,子类和子类产生的对象都可以通过'点'的方式使用父类中的数据
class Father:
money = 99999999
house = '老北京四合院'
class Son(Father):
pass
# 子类直接使用父类中的数据
print(Son.money)
# 子类产生的对象使用父类中的数据
obj1 = Son()
print(obj1.money)
------------------------------------------------------------------------------------
99999999
99999999
4、继承后名字查找的顺序
未继承:
对象(object)自身名称空间>>>类的名称空间
单线继承:
对象(object)自身名称空间>>>子类的名称空间>>>父类的名称空间
多线继承:
1、菱形继承: (广度优先,最后才会找闭环的定点)
对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)>>>闭环
2、非菱形继承: (深度优先)
对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)
在一个子类绑定多个父类时,名字的查找顺序可能比较难理解,针对这个问题,可以使用python中内置方法:mor()
通过对象名点mor() 的方式,可以帮助我们查看名字的查找顺序
5、经典类与新式类
经典类:
不继承object的类或者其子类的类
新式类:
继承object或者其之类的类
在python3中,只有新式类,所有类都默认继承object
在python2中,区分经典类和新式类
在以后我们定义类的时候,如果没有明确的父类,可以在类的括号内填入object,这样话能够提高我们代码的兼容性
二、派生
1、派生的概念
派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法
2、派生的方法
1.直接引用父类的__ init __为其传参,并添加子类属性
缺点:代码重复率太高,浪费资源,时间
class People:
school = '清华大学'
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
class Teacher(People):
def __init__(self, name, sex, age, title): #派生
self.name = name
self.sex = sex
self.age = age
self.title = title
def teach(self):
print(f'{self.name}是老师')
obj = Teacher('lili','female', 28, '高级教师')
#只会找自己类中的__init__
print(obj.name, obj.sex, obj.age, obj.title)
#lili female 28 高级教师
2.通过super()来只想父类的属性
super()是一个特殊的类,在子类__ init __内调用super得到一个对象,该对象指向父类的名称空间
class Teacher(People):
def __init__(self, name, sex, age, title):
super().__init__(name, age, sex)
#调用的是绑定方法,自动传入self
self.title = title
def teach(self):
print(f'{self.name}是老师')
obj = Teacher('lili','female', 28, '高级教师')
注意:在python2中super 的使用需要完整地写成super(自己的类名,self),而在python3中可以简写为super()。
来源:https://www.cnblogs.com/kangssssh/p/16855176.html
猜你喜欢
- 1.查询高于平均价格的商品名称:SELECT item_name FROM ebsp.product_mark
- 请问如何处理Oracle中较大的文本数据?我们可在ASP中予以解决,如在Oracle8i中文版中,建立数据表:CREATE TABLE SY
- 本文实例为大家分享了js实现滑动进度条效果的具体代码,供大家参考,具体内容如下进度条:<!DOCTYPE html><ht
- file_get_contents的超时处理话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.
- python 根据正则表达式提取指定的内容正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事。 下面演
- 其实所有的死锁最深层的原因就是一个:资源竞争。表现一:一个用户A 访问表A(锁住了表A),然后又访问表B
- 本文实例为大家分享了JSP实现客户信息管理系统的具体代码,供大家参考,具体内容如下项目示意图大概这样吧。我自己画的 登录界面代码index.
- 本文实例讲述了php查询whois信息的方法。分享给大家供大家参考。具体如下:这里使用php通过查询whois信息的网站列表进行查询func
- 模板引擎的思想是来源于MVC(Model View Controller)模型,即模型层、视图层、控制器层。在Web端,模型层为数据库的操作
- 数据库查询优化的实用技巧:本文中,abigale代表查询字符串,ada代表数据表名,alice代表字段名。技巧一:问题类型:ACCESS数据
- 昨天美国雅虎正式宣布网站首页的新版,这也算互联网一件大事,尤其是对设计的朋友们。而且现在的美国雅虎的情况也不是很好的情况下有大刀阔斧的进行改
- 问题你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,A
- 另外,我们在 控制结构比较两个数值是否一直的时候,也应该尽量使用 === 来代替 ==(当然,这个也根据具体的业务逻辑选用比较合适的)。 小
- 简单的说,一个数据库管理系统应该的提供的基本服务有两种:1.数据访问。对每个数据库管理系,数据访问服务都包含一下几种(1)插入--向数据库中
- 上段时间,团队内部有过好几次几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了写口语化的描述,留作备案。一、讲个故事吧澄清在
- 本文实例讲述了PHP实现从上往下打印二叉树的方法。分享给大家供大家参考,具体如下:问题从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- 1.什么是守护进程守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会
- 第1章 argparse简介1.1 解析argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块
- 大家在写按钮(input、button)的时候会发现在 IE 下:随着字数的增多,两边的间距也会越来越大。在 WIN 的XP 风格下,当字数
- 效果图展示:源码查看【功能说明】利用insertBefore制作简单的循环插空效果【HTML代码说明】<ul class="