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 = name
        self.age = age
        self.weight = weight
    
    def 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 = name
        myself.age = age
        myself.weight = weight

    def 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 = name
        self.age = age
        self.sex = sex
    def eating(self):
        print("我吃东西了.")
    def running(self):
        print("我跑步了.")

class Son(Father):
    def __init__(self):
        pass

person = Son()
person.eating()
person.running()

效果图:

多继承:

#多继承
class Father():
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def eating(self):
        print("我吃东西了.")
    def running(self):
        print("我跑步了.")
    def speking_f(self):
        print("我是爸爸.")

class Mother():
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def eating(self):
        print("我吃东西了.")
    def running(self):
        print("我跑步了.")
    def speaking_m(self):
        print("我是妈妈.")

class Son(Father,Mother):
    def __init__(self):
        pass

person = 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 = age
        
class 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 = age

class 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.mfbz.cn/a/455300.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能革新:思通数科开源AI平台在保险合同管理中的应用与优化

思通数科开源的多模态AI能力引擎平台是一个强大的工具,它结合了自然语言处理(NLP)、图像识别和语音识别技术,为企业提供自动化处理和分析文本、音视频和图像数据的能力。这个平台的开源性质意味着它可以被广泛地应用于各种业务场景…

idea Springboot 在线考试管理系统开发mysql数据库web结构java编程计算机网页

一、源码特点 springboot 在线考试管理系统是一套完善的完整信息系统,结合mvc框架和bootstrap完成本系统springboot spring mybatis ,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有…

这个学习Python的神仙网站,后悔没早点发现

Python 作为时下最流行的编程语言,很多初学者都将它作为自学编程的首选。不管是有编程经验的开发者,还是新手小白,在这个 AIGC 时代, Python 都可以带你探索新世界。 入门 Python 绝非难事,但如何让自己坚持学下去是如…

Set cancelled by MemoryScratchSinkOperator

Bug信息 Caused by: com.starrocks.connector.spark.exception.StarrocksInternalException: StarRocks server StarRocks BE{host=10.9.14.39, port=9060} internal failed, status code [CANCELLED] error message is [Set cancelled by MemoryScratchSinkOperator]Bug产生的…

RC522刷卡电路设计及程序

一、RC522刷卡电路组成 基于RC522的刷卡电路如上图所示。该电路组成主要分为三部分: Receiving Circuit:接收电路,接收卡发送的数据。 Filtering Impedence-Transtorm circuit:滤波和阻抗变换电路,抑制高次谐波并优化到读卡器天线…

POS 之 验证者如何才能提议区块

验证者提议区块 验证者帐户提议区块。 验证者帐户由节点运营商(可以是AWS等待云服务商)管理,节点运营商运行验证者软件作为其执行和共识客户端的一部分,并且已经向存款合约中存入了至少 32 个以太币 然而,每个验证者只是偶尔负责提议一个区块…

imagemagick深度系统(deepin)安装

背景: 为了试用MoneyPrinter,需要配置imagemagick软件。但是没有适配深度系统的软件包。需要自己编译后安装。 安装: 下载源码 解压(tar xvfz ImageMagick.tar.gz)后进入目录(cd ImageMagick-7.1.1),使用…

第十四届蓝桥杯省赛真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 阶乘求和试题 B: 幸运数字试题 C: 数组分割试题 D: 矩形总面积试题 E: 蜗牛试题 F: 合并区域试题 G : \mathrm{G}: G: 买二赠一试题 H \mathrm{H} H : 合并石子试题 I:最大开支试题 J : \mathrm{J}: J: 魔法阵 发现宝藏 前…

Pytorch学习 day14(模型的验证步骤)

如何利用已经训练好的模型,验证它的结果,步骤如下: 步骤一:加载测试输入并更改为合适尺寸 保存图片到指定文件夹下,注意是否为同级目录注意:返回上一级目录为“…/xxx"有时,我们自己的输…

WRF模型运行教程(ububtu系统)--II.ARWpost安装

一、ARWpost简介 ARWpost 是一个把 WRF 结果转为 GrADS 或 Vis5D 可以辨识的数据格式的软件,就是WRF运行结束以后,把WRF的结果变成咱们平时比较常用的数据格式。 二、下载和安装ARWpos_V3 1.ARWpos_V3安装前准备 # 进入Build_WRF文件夹 cd Build_WRF …

Devin,第一位AI软件工程师

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

已经连接过的网络的密码忘记了,怎么快速找回?

使用笔记本电脑曾经连接过一些无线路由器,时间久了,密码可能就忘记了。再使用其他设备连接时,就需要尝试去找到这个密码。本片文章就是通过几个命令快速找到之前使用笔记本电脑曾经连接过的无线网络的密码。 第一步、查看曾经连接过哪些无线网…

Django框架的全面指南:从入门到高级【第128篇—Django框架】

Django框架的全面指南:从入门到高级 Django是一个高效、功能强大的Python Web框架,它被广泛用于构建各种规模的Web应用程序。无论是初学者还是有经验的开发人员,都可以从入门到掌握Django的高级技巧。在本指南中,我们将带你逐步了…

软考高级:面向对象分析概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Celery知识

celery介绍 # celery 的概念: * 翻译过来是芹菜 * 官网:https://docs.celeryq.dev/en/stable/ # 是分布式的异步任务框架: 分布式:一个任务,拆成多个任务在不同机器上做 异步任务:后台执行…

【AI大模型应用开发】【LangChain系列】9. 实用技巧:大模型的流式输出在 OpenAI 和 LangChain 中的使用

大家好,我是同学小张,日常分享AI知识和实战案例欢迎 点赞 关注 👏,持续学习,持续干货输出。v: jasper_8017 一起交流💬,一起进步💪。微信公众号也可搜【同学小张】 🙏 本…

六 超级数据查看器 讲解稿 详情1 概述

六 超级数据查看器 讲解稿 详情1 概述 点此此处 以新界面 打开B站 当前视频教程 APP下载地址 百度 下载地址 ​ 讲解稿全文: 大家好,今天我们讲解一下超级数据查看器详情界面。由于内容较多,讲解要分为7集,这是第一集 首…

Python导入类说一说

要在Python中导入一个类,需要使用import关键字。 详细去看下面的代码 1、多例类 class Restaurant:餐馆类def __init__(self,restaurant_name,cuisine_type):#类的属性self.restaurant_name restaurant_nameself.cuisine_type cuisine_type# self.stregth_leve…

如何利用ChatGPT联系英语口语和听写!分享一些Prompt!

参考文章 ChatGPT4升级方法 namecheap购买方法 sora namecheap 支付 首先先看ChatGPT修改英语作文的能力 足以证明ChatGPT的能力 ChatGPT英语练习 口语: 实时交谈纠错发音纠错语句 写作: 写作建议构思文本 模拟考试: 雅思、托福和…

论文阅读——Vision Transformer with Deformable Attention

Vision Transformer with Deformable Attention 多头自注意力公式化为: 第l层transformer模块公式化为: 在Transformer模型中简单地实现DCN是一个non-trivial的问题。在DCN中,特征图上的每个元素都单独学习其偏移,其中HWC特征图上…