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.hqwc.cn/news/536866.html

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

相关文章

查找jdk的安装

方式1:which或者where java which java -- linux where java --windows 方式2: echo 使用echo 打印配置的java home环境变量 echo $JAVA_HOME$ --linux echo %JAVA_HOME% --windows 方式3:使用ls -lrt -a :显示所有文件即目录…

挑战杯 大数据房价预测分析与可视

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据房价预测分析与可视 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖,适合…

【刷题笔记】动态规划

动态规划刷题笔记(基础题) ① 打家劫舍② 删除并获得点数③ 不同路径④ 最小路径和⑤ 不同路径Ⅱ⑥ 统计全为 1 的正方形子矩阵⑦ 最大正方形 ① 打家劫舍 //不在栈内申请内存,防止溢出 int dp[101] {0}; class Solution { public:int rob(…

机器学习笔记 - 用于3D物体检测的KITTI数据集的使用及说明

一、什么是 KITTI 数据集? KITTI 是由卡尔斯鲁厄理工学院和芝加哥丰田理工学院开发的自动驾驶数据集(目前分2012和2015版本)。它是计算机视觉研究中使用的图像和 LIDAR 数据的集合,例如立体视觉、光流、视觉里程计、3D 对象检测和…

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理 一、安装OpenCV-3.4.161.下载OpenCV-3.4.16安装包2.将安装包放到/home,并解压3.使用 cmake 安装 opencv4.配置环境5.查看 opencv 的版本信息 二、处理图片(一)创建文件夹 code &#…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Toggle)

组件提供勾选框样式、状态按钮样式及开关样式。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 仅当ToggleType为Button时可包含子组件。 接口 Toggle(options: { type: ToggleType, is…

【ARM】MDK在programming algorithm界面添加FLM

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决在programming algorithm界面中无法添加想要的Flash编程算法的问题 2、 问题场景 在对于Debug进行Flash Download进行配置的时候,在programming algorithm界面中有对应的Flash编程算法。可以通过…

C++初阶:内存管理

目录 1. C/C中各种资源的内存分布1.1 C/C程序内存区域划分1.2 各资源的内存分布情况(练习) 2. C中的动态内存管理方式2.1 new/delete开辟内置类型空间2.2 new/delete开辟销毁自定义类型空间 3. operator new 与 operator delete函数4. new与delete的实现…

环信ChatroomUIKit功能详解——超详细介绍

聊天室是当下泛娱乐社交应用中最经典的玩法,通过调用环信的 IM SDK 接口,可以快速创建聊天室。如果想根据自己业务需求对聊天室应用的 UI界面、弹幕消息、礼物打赏系统等进行自定义设计,最高效的方式则是使用环信的 ChatroomUIKit 。 文档地址…

解决JVM进程被系统杀掉问题

背景 服务A在测试环境,隔几个小时接口就无法访问。登录机器查看,发现进程已经没了。大致猜想是进程使用的内存或CPU资源使用太多,导致被系统kill。 问题定位 使用dmesg命令查看进程被kill的详情。 > dmesg --time-format iso2024-03-0…

29网课交单平台源码最新修复全开源版本

去除论文编辑 去除强国接码 修复上级迁移 修复聚合登录 修复支付不回调 优化支付接口兼容码/易支付 优化MySQL表,提高网页加载速度 下载地址:https://pan.xunlei.com/s/VNstLrJaRtbvDyovPQ-CbISOA1?pwd622t#

C# 第三方曲线库及其特点

在 C# 中,有几个第三方库可以用于绘制曲线图,每个库都有自己的特点和优势。以下是一些常见的 C# 第三方曲线库及其特点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.LiveC…