Python中类的定义和使用细讲

文章目录

  • 前言
  • 一、定义类
  • 二、创建类的实例
  • 三、创建 _ _ init _ _() 方法
  • 四、创建类的成员并访问
    • 1. 创建实例方法并访问
    • 2. 创建数据成员并访问
  • 五、访问限制


前言

  在 Python 中,类表示具有相同属性方法对象的集合。在使用类时,需要先定义类,然后再创建类的实例通过类的实例就可以访问类中的属性和方法了。


一、定义类

  在 Python 中,类的定义使用 class 关键字来实现,语法如下:

class ClassName:'''类的帮助信息'''  # 类文档字符串statement          # 类体 

参数说明

  • ClassName:用于指定类名,一般使用大写字母开头,如果类名中包括两个单词,第二个单词的首字母也大写,这种命名方法也称为 “驼峰式命名法”,这是惯例。当然,也可根据自己的习惯命名,但是一般推荐按照惯例来命名。
  • ‘’‘类的帮助信息’‘’:用于指定类的文档字符串,定义该字符串后,在创建类的对象时,输入类名和左侧的括号 “(” 后,将显示该信息。
  • statement:类体,主要由类变量(或类成员)、方法和属性等定义语句组成。如果在定义类时,没想好类的具体功能,也可以在类体中直接使用 pass 语句代替。

  例如,下面以鸟为例声明一个类,代码如下:

class Bird:"""鸟类"""pass

二、创建类的实例

  定义完类后,并不会真正创建一个实例。这有点像一个汽车的设计图。设计图可以告诉你汽车看上去什么样,但设计图本身不是一个汽车。你不能开走它,它只能用来建造真正的汽车,而且可以使用它制造很多辆汽车。那么如何创建实例呢?
  class 语句本身并不创建该类的任何实例。所以在类定义完成以后,可以创建类的实例,即实例化该类的对象。创建类的实例的语法如下:

ClassName(parameterlist)

  其中,ClassName 是必选参数,用于指定具体的类;parameterlist 是可选参数,当创建一个类时,没有创建 _ _ init _ _() 方法(该方法将在下面介绍),或者 _ _ init _ _() 方法只有一个 self 参数时,parameterlist 参数可以省略。
  例如,创建上面定义的鸟类的实例,可以使用下图所示的代码:

在这里插入图片描述


三、创建 _ _ init _ _() 方法

  在创建类后,可以手动创建一个 _ _ init _ _ () 方法。该方法是一个特殊的方法。每当创建一个类的新实例时,Python 都会自动执行它。_ _ init _ _() 方法必须包含一个 self 参数,并且必须是第一个参数。self 参数是一个指向实例本身的引用,用于访问类中的属性和方法。在方法调用时会自动传递实际参数 self,因此当 _ _ init _ _() 方法只有一个参数时,在创建类的实例时,就不需要指定实际参数了。
说明在 _ _ init _ _() 方法的名称中,开头和结尾处是两个下划线(中间没有空格),这是一种约定,旨在区分 Python 默认方法和普通方法。
  例如,下面仍然以鸟为例声明一个类,并且创建 _ _ init _ _() 方法,代码如下图所示:

在这里插入图片描述

  从上面的代码及运行结果可以看出,在创建鸟类的实例时,虽然没有为 _ _ init _ _() 方法指定参数,但是该方法会自动执行。

注意:在创建 _ _ init _ _() 方法时,一定要在括号中添加 self,否则会报错如下图所示。

在这里插入图片描述

  在 _ _ init _ _() 方法中,除了 self 参数外,还可以自定义一些参数,参数间使用逗号 “,” 进行分隔。例如,下面的代码将在创建 _ _ init _ _() 方法时,再指定 2 个参数,分别是 color,shape。

class Apple:  # 创建一个苹果类"""苹果类"""def __init__(self, color, shape):  # 构造方法print('我是苹果类,我有以下特征:')print(color)  # 输出颜色特征print(shape)  # 输出形状特征
color_1 = '颜色是红色的'  # 颜色特征
shape_1 = '形状是球形的'  # 形状特征
red_apple = Apple(color_1, shape_1)  # 创建苹果类的实例

  执行上面代码后,结果如下:

我是苹果类,我有以下特征:
颜色是红色的
形状是球形的

四、创建类的成员并访问

  类的成员主要由实例方法数据成员组成。在类中创建了类的成员后,可以通过类的实例进行访问。

1. 创建实例方法并访问

  所谓实例方法是指在类中定义的函数该函数是一种在类的实例上操作的函数。同 _ _ init _ _() 方法一样,实例方法的第一个参数必须是 self,并且必须包含一个 self 参数。创建实例方法的语法格式如下:

def functionName(self, parameterlist):block

参数说明

  • functionName:用于指定方法名,一般使用小写字母开头
  • self:必要参数,表示类的实例,其名称可以是 self 以外的单词,使用 self 只是一个惯例而已。
  • parameterlist:用于指定除 self 参数以外的参数,各参数间使用逗号 “,” 进行分隔。
  • block:方法体,实现的具体功能。

说明实例方法和 Python 中的函数的主要区别就是,函数实现的是某个独立的功能,而实例方法是实现类中的一个行为,是类的一部分。

  实例方法创建完成后,可以通过类的实例名称 (.)操作符进行访问,语法格式如下:

instanceName.functionName(parameterlist)

参数说明

  • instanceName:为类的实例名称。
  • functionName:为要调用的方法名称。
  • parameterlist:表示为方法指定对应的实际参数,其值的个数与创建实例方法中 parameterlist 的个数相同。
  • block:方法体,实现的具体功能。

  例如,创建一个人类,并定义一个构造方法,然后再定义一个实例方法 run(),该方法有两个参数,一个是 self,另一个是 speed,最后再创建人类的实例,并调用实例方法 run(),代码如下:

class People:  # 创建一个人类"""人类"""def __init__(self, eye, mouth):  # 构造方法print('我是人类,我有以下特征:')print(eye)  # 输出眼睛特征print(mouth) # 输出嘴巴特征def run(self, speed):  # 定义跑的方法print(speed)
eye_1 = '我有两只眼睛'  # 眼睛特征
mouth_1 = '我有一个嘴巴'  # 嘴巴特征
man = People(eye_1, mouth_1)  # 创建人类的实例
man.run('我跑起来非常快')  # 调用实例方法

  运行上面代码后,结果如下:

我是人类,我有以下特征:
我有两只眼睛
我有一个嘴巴
我跑起来非常快

2. 创建数据成员并访问

  数据成员是指在类中定义的变量,即属性,根据定义位置,又可以分为类属性实例属性

  • 类属性

  类属性是指定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值,也就是在所有实例化的对象中公用
说明类属性可以通过类名称或者实例名访问。

  例如,定义一个人类 People,在该类中定义 2 个类属性,代码如下:

class People:  # 创建一个人类"""人类"""eye = '有两只眼睛'mouth = '有一个嘴巴'def __init__(self):  # 构造方法print('我属于人类,我有以下特征:')print(People.eye)  # 输出眼睛特征print(People.mouth) # 输出嘴巴特征
man = People()  # 实例化一个人类的对象

  运行上面代码后,结果显示如下:

我属于人类,我有以下特征:
有两只眼睛
有一个嘴巴

  在 Python 中除了可以通过类名称访问类属性,还可以动态地为类和对象添加属性。例如,在上面 People 类的基础上添加一个 arm 属性,并通过类的实例访问该属性,可以在上面代码的后面再添加以下代码:

People.arm = '有两个胳膊'
print(man.arm)

  运行代码后,结果显示如下:

我属于人类,我有以下特征:
有两只眼睛
有一个嘴巴
有两个胳膊

说明除了可以动态地为类和对象添加属性,也可以修改类属性。修改结果将作用于该类的所有实例。

  • 实例属性

  实例属性是指定义在类的方法中的属性,只作用于当前实例中。例如,定义一个人类 People,在该类的 _ _ init _ _() 方法中定义 2 个实例属性,用于记录人类的特征,代码如下:

class People:  # 创建一个人类"""人类"""def __init__(self):  # 构造方法self.eye = '有两只眼睛'self.mouth = '有一个嘴巴'print('我属于人类,我有以下特征:')print(self.eye)  # 输出眼睛特征print(self.mouth) # 输出嘴巴特征
man = People()  # 实例化一个人类的对象

  上面代码运行后,显示以下结果:

我属于人类,我有以下特征:
有两只眼睛
有一个嘴巴

说明实例属性只能通过实例名访问。如果通过类名访问实例属性,将抛出如下图所示异常。

在这里插入图片描述

  对于实例属性也可以通过实例名称修改,与类属性不同,通过实例名称修改实例属性后,并不影响该类的另一个实例中相应的实例属性的值。例如,定义一个人类,并在 _ _ init _ _() 方法中定义一个实例属性,然后创建两个 People 类的实例,并且修改第一个实例的实例属性,最后分别输出实例 1 和实例 2 的实例属性,代码如下:

class People:  # 创建一个人类"""人类"""def __init__(self):  # 构造方法self.eye = '有两只眼睛'print('我属于人类,我有以下特征:')print(self.eye)  # 输出眼睛特征
man_1 = People()  # 创建People类的实例1
man_2 = People()  # 创建People类的实例2
man_1.eye = '有两只圆圆的大眼睛'  # 修改实例属性
print('man_1的eye属性:', man_1.eye)
print('man_2的eye属性:', man_2.eye)

  运行上面代码后,将显示以下内容:

我属于人类,我有以下特征:
有两只眼睛
我属于人类,我有以下特征:
有两只眼睛
man_1的eye属性: 有两只圆圆的大眼睛
man_2的eye属性: 有两只眼睛

五、访问限制

  在类的内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏了类内部的复杂逻辑。但是 Python 并没有对属性和方法的访问权限进行限制。为了保证类内部的某些属性或方法不被外部所访问,可以在属性或方法名前面添加双下划线(_ _ eye)或首尾添加双下划线(_ _ eye _ _)从而限制访问权限。其中,双下划线、首尾双下划线的作用如下:

  1. 首尾双下划线表示定义特殊方法,一般是系统定义名字,如 _ _ init _ _()
  2. 双下划线表示 private(私有)类型的成员只允许定义该方法的类本身进行访问,而且也不能通过类的实例进行访问,但是可以通过 “类的实例名._ 类名 _ _ xxx” 方式访问。

  例如,创建一个 People 类,定义私有属性 _ _ eye,并使用 _ _ init _ _() 方法访问该属性,然后创建 People 类的实例,并通过实例名输出私有属性 _ _eye,代码如下:

class People:  # 创建一个人类"""人类"""__eye = '有两只眼睛'def __init__(self):  # 构造方法print('__init__():', People.__eye)  # 在实例方法中访问私有属性
man = People()  # 创建People类的实例
print('加入类名:', man._People__eye)  # 私有属性,可以通过"实例名._类名__xxx"方式访问
print('直接访问:', man.__eye)  # 私有属性不能通过实例名访问,出错

  执行上面的代码后,将输出如下图所示结果:

在这里插入图片描述

  从上面的运行结果可以看出:私有属性不能直接通过实例名 + 属性名访问,可以在类的实例方法中访问,也可以通过 “类的实例名._ 类名 _ _ xxx” 访问

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

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

相关文章

expdp及impdp中的exclude及include参数

expdp 及imdpd命令中,exclude及include参数还是有一些要注意的地方,特别是涉及选择性条件时。 一、通用 1、exclude及include参数不能同时使用,这两个是相互排斥的。 2、在parfile参数文件中,可以同时用多个exclude参数&#xf…

Android安卓设置跳转默认应用商店为Google Play 链接跳转到谷歌商店临时解决方法

手机链接默认不跳转 Google Play 因为大部分安卓厂商系统都根据了自己的需求进行了修改,就成为了系统级导流,想要彻底解除可刷写国际版等原生系统即可恢复 解决方法 使用冻结软件(例如 爱玩机手机助手(root)等应用)对 应用商城 进行临时冻结,如需保证正常使用解除冻结状态即可…

WIFI模块(esp-01s)获取网络时间代码实现

目录 前言: 一、串口程序的编写 1、串口重定向 2、回调函数 二、WiFi模块发送AT指令 esp01s.c esp01s.h 三、数据处理 初始化 1、cjson的使用 2、字符串提取有用信息 3、转成标准时间 4.任务处理 前言: 前面讲解了使用AT指令获取网络时间与…

axios初入门

1,axiox的基本使用 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.…

清分系统对账

流程1的问题&#xff1a; 1、通道一天的数据会有多少&#xff0c;有二三十万条交易数据吗&#xff1f; 2、如果数据过大都存到一个Map里面去&#xff0c;机器不得挂了 步骤1总结&#xff1a; 1、通过channelNo获取通道T的数据&#xff0c;因为通道是一天一个文件给过来。在转…

首届教师案例教学竞赛一等奖作品上线至和鲸社区,快来学习!

细心的朋友可能已经发现&#xff0c;近期和鲸社区的频道页上线了一个新专区——“优秀参赛作品专区”。 图.和鲸社区频道页 迄今为止&#xff0c;和鲸参与/支持了 500 多场专业数据科学竞赛&#xff0c;包括面向气象、金融、医学、海洋等不同领域的&#xff0c;面向从业者、科学…

.net 8 发布了,试下微软最近强推的MAUI

先看下实现的效果&#xff1a; 下面发下XAML文件&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <ContentPage xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/…

使用物联网的家庭自动化

物联网家庭自动化&#xff1a;入门 家庭自动化由三个主要部分组成&#xff1a; 硬件 软件/应用程序 通讯协议 对于为客户构建真正的智能家居体验&#xff0c;这些部分都同样重要。拥有合适的硬件可以迭代开发物联网原型并轻松响应技术枢轴。 经过正确测试和仔细考虑后选择的协…

Linux C语言 25-预处理操作

Linux C语言 25-预处理操作 本节关键字&#xff1a;C语言编译过程、预处理、多行宏定义、通过宏判断操作系统、通过宏判断VC版本 相关C库函数&#xff1a;main&#xff0c;printf 什么是预处理&#xff1f; 预处理是C语言源码编译中重要的一步。用C语言编写的代码不能直接被…

案例027:基于微信小程序的校园二手平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

基于springboot实现智慧党建系统项目【项目源码】

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以…

银行测试--------转账

转账 付款账号测试 付款账号是借记卡&#xff0c;也可以是活期存折信用卡&#xff0c;定期存折不能转出。一般在账号选择的时候进行屏蔽转出账户在销户&#xff0c;冻结&#xff0c;挂失等异常状态&#xff0c;不能进行转账付款账号金额不够 转账金额测试 0.01&#xff5e;…

C++ libcxxabi中dynamic_cast 实现

摘要&#xff1a;最近在看一个崩溃的过程中详细看了一遍cxxabi的定义&#xff0c;就想着看一些llvm中cxxabi的一些实现。本文描述了cxxabi中dynamic_cast的实现以及原理。   关键字&#xff1a;cxxabi,dynamic_cast 1 简介 C中&#xff0c;dynamic_cast用于有虚函数的继承链…

【go入门】表单

4.1 处理表单的输入 先来看一个表单递交的例子&#xff0c;我们有如下的表单内容&#xff0c;命名成文件login.gtpl(放入当前新建项目的目录里面) <html> <head> <title></title> </head> <body> <form action"/login" meth…

【Java】循环语句练习

文章目录 1. 计算5的阶乘2. 计算 1! 2! 3! 4! 5!3. 数字9 出现的次数4. 判定素数5. 求1-100之间的素数6. 求2个整数的最大公约数7. 计算分数的值8. 模拟登陆9. 输出乘法口诀表10. 求出0&#xff5e;999之间的所有“水仙花数”并输出11. 猜数字游戏&#x1f648; 1. 计算5的…

Linux系统编程 day05 进程控制

Linux系统编程 day05 进程控制 1. 进程相关概念2. 创建进程3. exec函数族4. 进程回收 1. 进程相关概念 程序就是编译好的二进制文件&#xff0c;在磁盘上&#xff0c;占用磁盘空间。程序是一个静态的概念。进程即使启动了的程序&#xff0c;进程会占用系统资源&#xff0c;如内…

FO-like Transformation

参考文献&#xff1a; [RS91] Rackoff C, Simon D R. Non-interactive zero-knowledge proof of knowledge and chosen ciphertext attack[C]//Annual international cryptology conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 1991: 433-444.[BR93] Bellare M…

造一个float类型二维矩阵,并将二维矩阵存快速储到一个float*中(memcpy)

// 创建并初始化一个二维数组 std::vector<std::vector<float>> createAndInitializeArray(int rows, int cols) {std::vector<std::vector<float>> array(rows, std::vector<float>(cols));float value 0.0f;for (int i 0; i < rows; i) {…

大数据-之LibrA数据库系统告警处理(ALM-37007 Datanode进程异常)

告警解释 当出现如下情况时&#xff0c;产生该告警&#xff1a; DN实例数据目录中的postgresql.conf配置文件不存在或者其中某个配置参数不对。DN实例线程无法监听IP&#xff0c;或者无法绑定监听端口。DN实例进程没有其数据目录读写权限。 告警属性 告警ID 告警级别 可自…

4-Python与设计模式--抽象工厂模式

4-Python与设计模式–抽象工厂模式 一、快餐点餐系统 想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上&#xff0c; 有三类可以选择的上餐品&#xff1a; 汉堡等主餐、小食、饮料。当我们选择好自己需要的食物&#xff0c;支付完成后&#…