Python中的类【详谈】

零.前言:

本文适合对Python有浅浅了解的读者,并不能作为Python入门使用。

一.Python中类的属性、方法

在Python中有变量,有函数,例如下方:

def IAmAFunction():print("I am a function")IAmVariable = 250

我们创建了一个名为“IAmVariable”的变量跟一个名为“IAmAFunction”的函数。

当然,在中也有变量跟函数,不过在中的变量函数分别叫做:“属性”、“方法”。

例如:

class Sample():def __init__(self):self.name = "Pig"def Print_MyName(self):print(self.name)

我们创建了一个名为“Sample”的类,并且在这个类中创建了两个方法:“__init__()”、“Print_MyName”,一个属性:“self.name”。

对于类中的属性方法,同C++一样也分为:“保护”、“私有”、“公共”三大类。

不过在本章我们并不对这三类展开论述,感兴趣的读者可以移步作者的另一篇文章

二.__init__()方法:

所有的类都有一个内置的__init__()方法,它在创建一个类对象的时候“第一个被自动执行”。

每次创建一个新的类对象的时候,都会调用一次类的__init__()方法。

通过__init__()函数,我们可以在创建一个类对象的时候通过传参的方式人为的改变这个类对象的一些属性。

例如:

class Pig():def __init__(self,name,age,weight):self.name = nameself.age = ageself.weight = weightdef Pig_Information(self):print(f"本猪的名字是{self.name},芳龄是{self.age},还有俺的吨位是{self.weight}")pig = Pig("小芳","19","200kg")
pig.Pig_Information()

我们创建了一个Pig类,并且创建了一个pig对象pig对象在创建的时候传入了参数:“小芳”、“19”、“200kg”,这三个参数将分别通过__init__方法赋值给:“self.name”、“self.age”、“self.weight”三个属性。

最后我们调用Pig_Informaton()方法输出pig对象的各个属性。

三.self参数

self参数表示:“对当前类对象的引用,用于访问该类对象”。

PS:“它不必被命名为self,您可以随意改名并且调用它,但它必须是类方法的首个参数!!

例如,我们使用“me”和“myself”来代替self

class Pig():def __init__(myself,name,age,weight):myself.name = namemyself.age = agemyself.weight = weightdef Pig_Information(me):print(f"本猪的名字是{me.name},芳龄是{me.age},还有俺的吨位是{me.weight}")pig = Pig("小芳","19","200kg")
pig.Pig_Information()

运行结果:

 可以发现,self仅仅表示对某一个类对象的引用,为什么要用self?答案显而易见:

“例如有两个Pig()类对象,分别名为p1p2p1p2都有公共的类属性name”。

那么问题来了,如果没有self引用表示某个类对象,在类方法中使用的时候,程序又怎么知道使用的是p1还是p2name属性呢?所以需要self来表示是“p1”还是“p2”。

四.继承:子类继承父类

4.1继承的含义:

子类继承父类的所有属性和方法。

4.2继承方法

一般而言,使用类继承的时候,我们有如下操作:

父类不做任何操作。

子类在创建子类时将父类作为参数传入。

4.3不同的继承方式

继承又分为单继承跟多继承。

顾名思义,单继承就是有一个父类多继承就是有多个父类,并且这多个父类之间不能有继承的关系,即两个类没有交集或者交集为空。

单继承:

#单继承
class Father():def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexdef eating(self):print("我吃东西了.")def running(self):print("我跑步了.")class Son(Father):def __init__(self):passperson = Son()
person.eating()
person.running()

效果图:

多继承:

#多继承
class Father():def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexdef eating(self):print("我吃东西了.")def running(self):print("我跑步了.")def speking_f(self):print("我是爸爸.")class Mother():def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexdef eating(self):print("我吃东西了.")def running(self):print("我跑步了.")def speaking_m(self):print("我是妈妈.")class Son(Father,Mother):def __init__(self):passperson = Son()
person.speking_f()
person.speaking_m()

效果图:

4.4继承中的__init__()方法:

可能善于思考的同学会注意到,如果继承一个父类,这个父类也有一个__init__()方法,那我们子类中也有一个__init__()方法,最终执行的会是谁的呢?如果执行的是子类的,又该怎么使用父类的__init__()方法来初始化我的子类呢?

不要着急,我们慢慢来解答。

先看一段代码,相信大家就明白第一个问题的答案了:

class Father():def __init__(self):self.name = "父亲"def eating(self):print("我吃东西了.")def running(self):print("我跑步了.")def speking_f(self):print("我是爸爸.")class Son(Father):def __init__(self):self.name = "儿子"def speking(self):print(f"我的名字是:{self.name}")person = Son()
person.speking()

效果图:

很明显,是子类的init方法覆盖了父类的init方法,为此我们可以得出一个结论:“对于同名的属性和方法,在子类中定义的优先级大于在父类中定义的优先级。”

对于在,子类中执行父类的init方法,我们可以使用一种笨拙的方法,直接使用在类外调用类方法:

class Father():def __init__(self,age):self.name = "父亲"self.age = ageclass Son(Father):def __init__(self,age):Father.__init__(self,age)def speking(self):print(f"我的名字是:{self.name},年龄是{self.age}")person = Son("250")
person.speking()

效果图:

但是不建议使用这种方法,首先不利于阅读,其次这是非常危险的。

推荐使用super方法,讲在下文中提到。

五.super()方法

super()方法会使子类从其父类中继承所有方法和属性:

通过使用super()方法您不必使用在类外调用父类的方法,它将自动从其父类继承方法和属性。

class Father():def __init__(self,age):self.name = "父亲"self.age = ageclass Son(Father):def __init__(self,age):super(Son, self).__init__(age)def speking(self):print(f"我的名字是:{self.name},年龄是{self.age}")person = Son("250")
person.speking()

super()括号中,第一个参数表示子类,第二个参数表示子类的引用,而在后面init的括号中,表示需要传递的参数。

ps:“super()括号中的两个参数可以省略。

六.扩展

如果在开发中,需要对父类的方法进行修改,我们可以采用覆盖(重写)【扩展】的方式:

扩展的方式步骤

1.在子类中直接重写父类方法(麻烦)

2.在需要的位置使用super方法调用父类方法(便捷)

3.对代码特殊的位置进行特殊的编写(灵活)

其实,对于super的使用,更常见的是在子类中调用父类中封装的方法来扩展子类的方法

class Father():def eating(self):print("我在吃了.")def running(self):print("我在跑了")class Son(Father):def playing(self):print("我在玩了")def eating(self):print("我要去吃饭啦~")super(Son, self).eating()print("我吃完啦")person = Son()
person.eating()

效果图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/275397.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 判断触摸位置是否在图片的透明区域

装扮功能系列: Swift 使用UIScrollerView 实现装扮功能(基础)Swift 使用UIScrollerView 实现装扮功能(拓展)iOS 判断触摸位置是否在图片的透明区域 背景 在装扮功能中,一般都是长按使道具进入编辑状态&…

【Java设计模式】十九、中介者模式

文章目录 1、中介者模式2、案例3、总结 1、中介者模式 如图: 同事类之间关联较多时,整体出现网状结构,耦合度极高。一个对象一变动,好多对象都得改。若变为右边的星形结构,则一个类的变动,只影响自身与中介…

记录一下在Pycharm中虚拟环境的创建

如果在Pycharm中要新建一个虚拟环境,那你可以在Terminal中选择Command Prompt,在这里面执行相关命令 一、安装了Anaconda,创建虚拟环境 当你使用解释器是Anaconda提供的时,你可以使用conda命令执行,见以下操作&#x…

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议,广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式,因此它可以在没有时钟信号的情况下(异步模式)或有时钟信号的情况下(同步模式&#xff…

SQLiteC/C++接口详细介绍之sqlite3类(五)

快速跳转文章列表:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(四) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(六)(未发表) 14.sqlite3_busy_handle…

STM32输入捕获频率和占空比proteus仿真失败

这次用了两天的时间来验证这个功能,虽然实验没有成功,但是也要记录一下,后面能解决了,回来再写上解决的办法: 这个程序最后的实验结果是读取到的CCR1和CCR2的值都是0,所以没有办法算出来频率和占空比。 还…

STM32平替GD32有多方便

众所周知, GD32一直模仿STM32,从未被超越。 我最近公司使用的GD32E230C6T6 这款芯片有48个引脚。 属于小容量的芯片。 我有一个用STM32写的代码,之前是用的 STM32F103CB 这款芯片是中容量的。 不过在keil中,只需要这两步,就能使用原来的逻辑,几乎不用修改代码。 1. …

关于分布式微服务数据源加密配置以及取巧方案(含自定义加密配置)

文章目录 前言Spring Cloud 第一代1、创建config server项目并加入加解密key2、启动项目,进行数据加密3、实际项目中的测试server Spring Cloud Alibaba低版本架构不支持,取巧实现无加密配置,联调环境问题加密数据源配置原理探究自定义加密解…

Java学习笔记(11)

面向对象进阶 Static 静态变量 所有对象一起共享,就用static修饰 不属于对象,属于类的 可以用 类名.静态变量 “”;赋值 但是 对象.静态变量也可以访问到内容 Static内存图 Student这个类的字节码文件加载到方法区,并在内…

【C语言】Windows下的C语言线程编程详解

文章目录 1. 头文件1.1 windows.h1.2 process.h 2. 创建线程3. 线程同步3.1 线程同步方式3.1 互斥量(Mutex)3.2 事件(Event) 4. 线程的结束与资源管理5.线程池(简要) 在Windows平台下,C语言提供…

如何“使用Docker快速安装Jenkins,在CentOS7”?

1、运行 docker run -d --namejenkins -p 8080:8080 jenkins/jenkins 2、查看日志 ,使用 "docker logs -f jenkins",可以持续刷新日志 docker logs jenkins 3、通过命令查看密码 docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminP…

VUE内盘期货配资软件源码国际外盘二合一

开发一个Vue内盘期货配资软件源码,同时兼容国际外盘二合一的功能,是一个复杂且专业的任务,涉及前端Vue.js框架的使用、后端服务器处理、数据库管理、实时交易接口对接等多个方面。下面是一些关于开发此类软件的基本指导和考虑因素&#xff1a…

FFmpeg工作流程及视频文件分析

FFmpeg工作流程: 解封装(Demuxing)--->解码(Decoding)--->编码(Encoding)--->封装(Muxing) FFmpeg转码工作流程: 读取输入流--->音视频解封装--->解码音视频帧--->编码音视频帧--->音视频封装--->输出目标流 可简单理解为如下流程: 读文件-->解…

程序员的三重境界:码农,高级码农、程序员!

见字如面,我是军哥! 掐指一算,我在 IT 行业摸爬滚打 19 年了,见过的程序员至少大好几千,然后真正能称上程序员不到 10% ,绝大部分都是高级码农而已。 今天和你聊聊程序员的三个境界的差异,文章不…

【BFS二叉树】113路径总和II

113路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 思路: 题目最终输出的是路径,因此用BFS遍历的时候,需要记录走到每个节点的路径&#xff1…

排序算法之快速排序算法介绍

目录 快速排序介绍 时间复杂度和稳定性 代码实现 C语言实现 c实现 java实现 快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据…

报错:Nginx 部署后刷新页面 404 问题

文章目录 问题分析解决 问题 在部署完项目后 刷新页面,页面进入了404 分析 加载单页应用后路由改变均由浏览器处理,而刷新时将会请求当前的链接,而Nginx无法找到对应的页面 关键代码try_files,剩下俩如果其他地方配置了则可以省略。 在这…

Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)

任务一:用户登录 登录系统通常分为普通用户与管理员权限,在用户登录系统时,可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序,该程序分为管理员用户与普通用户,其中管理员账号密码在程序中设定&#…

云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践

导语 随着云计算技术的日益成熟,云原生应用已逐渐成为企业数字化转型的核心驱动力。在这一大背景下,高效、稳定、可扩展的消息流系统显得尤为重要。腾讯云高级开发工程师李伟先生,凭借其深厚的技术功底和丰富的实战经验,为我们带…

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量,或将一个普通变量导出为环境变量,并且在这个过程中,可以给该环境变量赋值。 下面…