Python学习笔记——类(基础知识)

学习编程,无论那种语言,面向对象编程(object-oriented programming,OOP)是当前最有效最普遍的编写方法之一。类则是面向对象编程的最基础的知识,可以说能够深刻理解类即掌握面向对象编程。

关于编程,归根结底是通过数据处理和处理数据完成特定任务的方式。如何更好的处理数据?把外界事物、情景、场景都抽象为对象,对象作为一种数据,有自己的个性与行为,把其通常的行为归纳、封装在一起,就是类。这样,基于类创建对象,根据需要赋予对象独特的个性。

简而言之,面向对象编程,就是编写表示现实世界中的事物和情景的类,基于这些类来创建对象。故编写的类,就是要定义一批对象都具备的通用行为。基于类创建的对象都自动具备这种通用行为,而且可以根据需要赋予每个对象独特的个性(属性)。

使用面向对象编程可模拟现实情景,及其逼真地表达外部世界逻辑。基于类创建的一个或若干相同的对象,及基于不同类创建的不同的对象,亦或基于具有传承关系的类创建的不同对象,它们模拟了现实世界的复杂的关系与相处情景,如同人类人与人、人与自然之间交互,然后,实现特定的任务。

1、概述:

学习面向对象编程有助于我们从另外一扇窗户看世界,明白编写的代码:不仅仅是每一行代码的作用,还有代码背后更宏大的概念。

了解类背后的概念可培养逻辑思维能力,让我们能够通过程序理解世界及解决遇到的几乎任何问题。类还能更融洽地与合作的及更多的程序员高效合作,彼此明白所做的工作,高效共享与写作,每个人都能事半功倍。

2、编写类:

使用类几乎可以模拟任何东西。下面一段简单的几行代码模拟了一个表示小狗的简单的类。

class Dog:'''一个模拟小狗的简单的类,有名字和年龄,有蹲下和打滚两个行为。'''def __init__(self,dog_name,dog_age):self.name = dog_nameself.age = dog_agedef sit(self):'''模拟小狗收到蹲下命令的行为'''print(f'{self.name} 收到蹲下命令,正在蹲下。')def roll_over(self):'''模拟小狗收到打滚命令的行为'''print(f'{self.name} 收到打滚命令,正在打滚。')

上面的Dog类——它表示的不是特定的小狗,而是任何小狗。通过这个Dog类,可以创建有名字、年龄,还有蹲下和打滚两种行为的不同小狗(对象)。类Dog,其实就是让Python知道如何创建表示小狗的对象。通过这个Dog类,可以使用它创建表示特定小狗的实例。

(1)根据约定,在Python中,首字母大写的名称指的是类。

(2)上面代码,通过关键字class定义一个Dog类,因为是创建的全新的类,所以定义时类名字后面不用加括号。如果是定义一个子类,需要在类名字后面加括号,括号内写明要继承的类(父类)。

(3)类名字后面一个冒号,然后下一行,约定一般是一个文档字符串,对类的功能做描述,让自己未来或者合作的其他人能够理解,但不需要撰写如何具体实现的细节。

(4)__init__()方法是一个特殊的方法,每当根据类创建新的实例(对象)时,Python会自动运行它。务必确保__init__()的两边都是两个下划线,否则使用类创建实例(对象)时,没有正确执行,将可能引发难以发现的错误。

上面代码定义的Dog类将__init__()方法定义了3个形参:self、dog_name、dog_age。在这个方法中,形参self必不可少,而且必须位于其它形参的前面。

为何必须在类的方法定义中包含形参self?因为当Python调用这个方法来创建实例时,将自动传入实参self。每个与实例对象相关联的方法调用,都会自动传入实参self,该实参是一个指向实例本身的引用,让实例能够访问类中的属性和方法。比如创建Dog类的实例时,Python将调用Dog类的__init__()方法。我们将通过实参向Dog()传递名字和年龄;self则自动传递,在调用时不要我们传递。每当使用Dog类创建实例时,都只需给最后两个形参(dog_name,dog_age)提供值。

(5)在__init__()方法内定义的连个变量都有前缀self(self.name,self.age)。以self为前缀的变量可供类中的所有方法使用,类的任意实例在(对象)都可以使用它。self.name = dog_name这行代码让self.name获取形参dog_name相关联的值,并将其赋给name变量,然后name变量被关联到当前创建的实例(对象)。这样就可以通过实例来访问(使用)name变量,即通过self.name使用name变量,像这种通过实例访问的变量称为属性(attribute)。(更严格地说,是类实例属性,或类对象属性,只有类实例化后赋予给对象变量后才可以使用。)

类的__init__()方法中,必须至少有一个形参self,根据需要设计其它形参及数量(也可以没有),有多少个这样的形参,在对类进行实例化时,就要提供相应的实参。需要清楚的是,self实参不是不用传入,而是Python自动传递而已,这是Python规则。

(6)上面代码定义的Dog类定义的两个方法:sit()和roll_over(),由于执行时候不需要额外的信息,因此只有一个形参self。类的实例化对象,调用这些方法时,Python也自动传递实参self,故类的实例化对象,调用这两个方法,方法内可以使用self.name等属性及其他方法。

3、根据类创建实例

可以将类视为有关如何创建实例的说明书。例如,Dog类就是一系列的说明,让Python知道如何创建表示特定小狗的实例。或者这样理解,类就如同一副中药方子,类的实例化,就是按照方子使用药材煎制出来一副药,这幅药就具备了相应的功能供使用。

下面创建一个表示特定小狗的实例:名字叫“金刚”,年龄3岁。

# 使用Dog类创建一个特定小狗实例,名字叫“金刚”,3岁
my_dog = Dog('金刚',3)# 让小狗蹲下
my_dog.sit()
# 让小狗打滚
my_dog.roll_over()# 使用小狗的名字name属性
print(f"我的小狗的叫{my_dog.name}。")
# 使用小狗的年龄age属性
print(f"我的小狗今年{my_dog.age}岁了。")

上面代码创建了一个名字叫“金刚”,年龄3岁的小狗。

Python在解释my_doy = Dog('金刚',3)这行代码时,调用Dog类中的__init__()方法,并传入实参“金刚”和3。__init__()方法创建了一个特定小狗实例,并且使用提供的值赋值给属性name和age,然后Python把这个小狗的实例赋给变量my_dog。

通常约定:首字母大写的名称表示类,比如Dog,而类实例用小写字母的名称,比如my_dog。

(1)访问属性

要访问实例的属性,使用点号(.)。如下:

my_dog.name

(2)调用方法

根据Dog类创建实例后,就可以使用点号来调用Dog类定义的方法了。要调用方法,需要指定实例名,通过点号,调用方法。比如让叫“金刚”的小狗蹲下:

my_dog.roll_over()

(3)创建多个实例

可按需求根据类创建任意数量的实例。比如下面再创建一个your_dog的小狗实例,名字叫“花花”,年龄5岁了。

my_dog = Dog('金刚',3)your_dog = Dog('花花',5)print(f"我的小狗名字叫{my_dog.name}")
print(f"你的小狗名字叫{your_dog.name}")my_dog.sit()
your_dog.roll_over()

上面代码创建了两条小狗,分别名字“金刚”和“花花”,每条小狗都是一个独立的实例,有自己的一组属性(名字,年龄等),能执行类定义的方法。

需要注意的是:即使给第二条小狗指定同样的名字和年龄,Python也会根据Dog类创建另一个实例,根据同一个类可以创建任意数量的实例,就算完全相同的属性,只要给实例起一个不一样的名字即可。

4、使用类和实例

可以使用类来模拟现实世界的很多情景。类编写好后,更多时间将根据类创建实例(对象)上。创建类的实例后,首要的事情之一就是修改实例的属性。既可以直接修改实例的属性,也可以在类中编写方法以特定的方式修改。

下面代码编写一个表示汽车的Car类,它存储了有关汽车的信息,并提供了一个汇总这些信息的方法:

class Car:'''一个模拟汽车的简单的类'''def __init__(self,manufacturer,model,year) -> None:'''初始化描述汽车的属性'''self.manufacturer = manufacturer   # 制造商self.model = model                 # 型号self.year = year                   # 生产年份self.odometer_reading = 0          # 行驶里程def get_descriptivate_info(self):'''返回格式化规范的描述性信息'''car_info = f"{self.year}生产 {self.manufacturer} {self.model}"return car_infodef read_odometer(self):'''打印一条汽车行驶里程的消息'''print(f"这辆汽车目前行驶了{self.odometer_reading}公里。")# 创建一个Car的实例,定义制造商是奥迪,型号是A4,生产年份是2024年
my_new_car = Car('audi','A4',2024)# 打印描述创建的小汽车的信息
print(my_new_car.get_descriptivate_info())# 打印小汽车目前行驶的历程信息
my_new_car.read_odometer()

上面代码定义了一个简单的表示汽车的类Car。定义的__init__()方法有4个形参,第一个是必须的形参self。此外还有3个形参:manufacturer、model、year。__init__()方法接收这些形参的值,并将它们赋值给类创建的实例的属性。在根据类Car创建实例时,需要指定其制造商、型号、生产年份。

Car类中定义了一个get_descriptivate_info()的方法,它使用实例属性(manufacturer、model、year)创建一个对汽车进行综合描述的字符串信息,表明实例对象是一个什么样的汽车。

(1)给属性指定默认值

关于属性,通常是指通过通过实例访问的变量(和类的实例关联),在类中是通过“self.属性”来使用,类实例化后,通过“实例化对象变量名.属性名”来引用。

有些属性是通过类的__init__()方法中定义形参,实例时候传入相应的实参,并在__init__()方法中定义(初始化)。

有些属性在__init__()方法中定义的形参,实例化是传入的对应的实参,在__init__()方法中为之指定默认值(初始化值),比如Car类的__init__()方法中定义的(manufacturer,model,year)形参。

有些属性在__init__()方法中直接进行定义,比如Car类中__init__()方法中定义的odometer_reading属性,并初始化值为0。根据Car类创建的新实例,其属性“行驶历程”都是0。

(2)修改属性的值

可以用三种不同的方式修改属性的值:直接通过实例修改,通过在类中定义一个方法修改,以及通过类中定义的方法中改变。

# 创建实例
my_new_car = Car('audi','A4','2024')# 修改实例对象的行驶里程属性
my_new_car.odometer_reading =23 
def update_odometer(self,mileage):'''将里程表更新为指定的值'''self.odometer_reading = mileage

上面一段代码定义一个方法,更新属性odometer_reading

def increment_odometer(self,miles):'''给里程表属性增加指定的量'''self.odometer_reading += miles

上面的代码,在类中定义了一个increment_odometer()方法,给属性odometer_reading增加指定量的里程。

总结与回顾:

编写类,是为了可以基于类创建一个或任意数量的实例(对象),并赋予不同实例独特个性,但都具备相同的通常行为,实现不同的相识的任务的代码块。这是编写类的出发点也是根本点,所以编写类的对象属性与通常方法乃是最为根本要务。

(1)类:是通过抽象与归纳描述的一个具有独特个性且有相同行为的情景或者事务,比如Dog类,所有小狗都会蹲下和打滚,但它们有不同的名字、年龄(当然还可以定义颜色、品种等)。相当于一个说明书,让Python知道如何创建。

(2)实例:也叫对象,是通过类文件由Python创建并赋给一个变量,每个类都可以创建任意数量的实例,它们可以由独特的个性(类中定义的属性),但具有相同的行为(类中定义的方法)。

(3)属性:是指在类中通过“self.属性名”来定义,在类实例化后,通过“实例名.属性名”来调用及更改,是和实例后的对象关联的一个变量。

(4)方法:通常是指在类中定义的一个方法,至少有一个形参self,类实例化后,通过赋值给的变量(对象)名来调用,执行一些任务的函数代码块。

(5)self:在Python编程中,self是一个极其特殊的存在,可以说无处不在。self存在与类的定义中,是类本身的一个指引。在类的方法中,第一个形参就是self,而且必须是self,如果类中定义的方法只有一个形参,那就是self。

在类实例化时,Python会自动传入实参self(类的实例对象),故不需要在调用类的实例对象的方法传入的实参中写明(也不能写),仅需要传入其他定义的实参即可。

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

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

相关文章

docker之安装mongo创建运行环境

目录 一、docker pull 最新资源 二、启动mongo镜像 启动命令查看日志拉取低版本镜像成功启动 三、进入mongo容器 进入容器进入mongo环境查询当前所在库切换库至admin随意切换库 并 创建用户登录用户新增文档数据等 五、总结 版本兼容可备份操作 一、docker pull 最新资源…

java序列化之Jackson

当涉及到在Java中进行JSON序列化和反序列化时,Jackson和Gson是两个最常用的库。它们都提供了强大的功能来处理JSON数据,但在某些方面有一些不同之处。 Jackson Jackson 是一个功能强大且灵活的 JSON 处理库,由 FasterXML 维护。以下是 Jackson 的一些特点 强大的功能 Ja…

关于OpenAI的Sora的基本介绍

OpenAI Sora:探索人工智能与区块链技术的融合 随着人工智能(AI)和区块链技术的日益成熟,OpenAI Sora 应运而生,成为这两大前沿技术融合的典型案例。本文将为您科普OpenAI Sora,探讨其在AI与区块链领域的独…

C#中的`out`关键字

C# 中的 out 关键字是一个用来在方法调用时传递数据的修饰符。它允许你在方法内部创建一个临时的变量,用于接收传递进来的参数值,并在方法执行完毕后,将该变量的值返回给调用方法的对象。out 关键字主要用于那些需要知道方法执行结果的参数上…

顺序表详解(如何实现顺序表)

文章目录 前言 在进入顺序表前,我们先要明白,数据结构的基本概念。 一、数据结构的基本概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来。所谓数据就是?常见的数值1、2、3、4.....、姓名、性别、年龄,等。…

开发一款招聘小程序需要具备哪些功能?

随着时代的发展,找工作的方式也在不断变得简单,去劳务市场、人才市场的方式早就已经过时了,现在大多数年轻人都是直接通过手机来找工作。图片 找工作类的平台不但能扩大企业的招聘渠道,还能节省招聘的成本,方便求职者进…

C# 使用onnxruntime部署夜间雾霾图像的可见度增强

目录 介绍 模型信息 效果 项目 代码 下载 C# Onnx 使用onnxruntime部署夜间雾霾图像的可见度增强 介绍 github地址:GitHub - jinyeying/nighttime_dehaze: [ACMMM2023] "Enhancing Visibility in Nighttime Haze Images Using Guided APSF and Gradien…

php7 新特性总结和举例说明

1,标量类型声明和返回值类型声明 在函数参数和返回值中指定期望的数据类型,包括(int,float,string,bool)。 举例: function addNumbers(int $a, int $b) : int {return $a $b; }va…

Flutter面试之事件分发机制

Flutter中事件分发的主要类:PointerEvent、HitTestResult、HitTestEntry、RenderObject,以及它们之间的关系。 1. PointerEvent PointerEvent是Flutter中所有事件的基类。它包含了事件的类型、位置、时间戳、设备信息等。PointerEvent的子类包括PointerDownEvent、PointerM…

如何修改unity的背景颜色

要在Unity中将背景颜色设为黑色,可以按照以下步骤进行: 1、在Unity编辑器中,选择你想要修改背景颜色的摄像机对象(一般是Main Camera)。 2、在Inspector面板中,找到"Clear Flags"(清…

ChatGPT 4.0 升级指南

1.ChatGPT 是什么? ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人,它基于强大的语言处理模型 GPT(Generative Pre-trained Transformer)构建。它能够理解人类语言,可以为我们解决实际的问题。 1.模型规模…

计网 - 域名解析的工作流程

文章目录 Pre引言1. DNS是什么2. 域名结构3. 域名解析的工作流程4. 常见的DNS记录类型5. DNS安全6. 未来的发展趋势 Pre 计网 - DNS 域名解析系统 引言 在我们日常使用互联网时,经常会输入各种域名来访问网站、发送电子邮件或连接其他网络服务。然而,我…

OpenAI Sora文本生成视频注册教程

使用Sora需要确保已经注册了OpenAI账户并升级到ChatGPT Plus,Sora目前仍处于早期访问或测试阶段,还没有进入公测阶段,请耐心关注和等待。 据官方透露的消息,OpenAI近期大概率会宣布将Sora首批开放给Chatgpt Plus用户申请使用。所…

Java中使用Jedis实现Redis的“查找附近的人”功能示例

在Java中,你可以使用Jedis库来与Redis进行交互,实现查找附近的人等功能。以下是一个简单的Java示例,展示了如何使用Jedis来实现这个功能: 首先,确保你已经在项目中添加了Jedis的依赖。如果你使用Maven,可以…

Java中的关键字

✨✨ 所属专栏: Java基石:深入探索Java核心基础✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 Java中的关键字是一些具有特殊含义的单词,它们在语法中有特定的用途,不能用作标识符&am…

[力扣 Hot100]Day32 随机链表的复制

题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新…

论文导读 | 因式分解数据库

背景和问题定义 在传统的关系型数据库中,二维表格形式容易造成信息的冗余。如果我们将数据库中的每条元组看成单项式,一个关系型数据库就可以表示成这些单项式的和。通过对多项式的因式分解就能够得到更加紧凑的表示形式。 例如:下图中的表…

使用openssl,在windows sever上创建ca,以及签发证书

创建2个目录,一个ca,一个certs ca: 存放ca相关数据certs: 存放申请的公私钥和配置 1 创建CA # 创建ca私钥,需要指定密码 openssl genrsa -aes256 -out ca.key 4096 # 生成证书 openssl req -x509 -new -nodes -key ca.key -sha256 -days 7300 -out ca.crt # 查看…

【设计模式】01-装饰器模式Decorator

作用:在不修改对象外观和功能的情况下添加或者删除对象功能,即给一个对象动态附加职能 装饰器模式主要包含以下角色。 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08…

unity打包apk运行于google手机

第一次打包apk运行于Pixel 7 Pro 一直提示安装包无法安装 untiy版本2020.1.0f1 有两点需要注意 第一 Scrpting Backend 需要选择 IL2CPP 勾选 ARM64 第二 勾选 Custom Main Mainfest 在Assets -> Plugins -> Android文件夹下 AndroidMainfest 中增加android:export…