22、Python之面向对象:万类霜天竞自由

引言

虽然,截止目前从来没有系统性地讲述面向对象的内容,但是阅读过前面文章的童鞋,关于Python中的面向对象应该有如下观念了:

1、Python中一切皆对象,对象有三个核心内容:id、类型、值。

2、Python中的函数和类也是一等公民。

3、面向过程和面向对象只是不同的编程范式,各自有擅长的使用场景,没有绝对的好坏之分。

其实,基于前面的3点,我们还可以有如下推导:

4、Python中一切皆是一等公民。

5、一切皆对象,则Python中的赋值皆为引用赋值,赋值的结果表现不同,更多的是源于所引用对象的可变、不可变。

6、每个对象都有一个所属类型,这个类型是创建对象的模板、机制,本身也是对象。

关于对象的类型,我们可以将类型简称为“类”。除了整数、浮点数、字符串、列表、元祖、字典等内置类型外,我们还可以根据需要自定义各种类型。相较于其他编程语言,Python中的面向对象实现得更加彻底。从而可以让我们定义出不逊色于内置类型的各种类型,实现“万类霜天竞自由”。

定义类(class)

在Python自定义类的语法很简单,关键点在于真正定义之前的面向对象的分析与设计,也就是所谓的OOA和OOD。

大体来说,有这么几个步骤:

1、分析业务需求,从需求中梳理出关键的业务实体,进而定义出实体的概念模型,通常来说,每一个业务实体对应一个类。

2、进一步细化每一个业务实体,梳理出实体中关键的业务属性,一般是静态的特征,这些就是类定义中的属性的分析了,这一步定义出了类的逻辑模型。

3、分析每一个业务实体需要具备的功能或者涉及到的操作,也就是梳理出类应当具备的方法,也就是类的动态行为特征。

可以对应到数据库的建模中,第一步梳理出业务实体类,也就是一个常规的关系表,这时只是需要有一个表的概念;第二步梳理出业务实体类中的静态属性,也就是表中应该具有的字段定义了;第三步是对表中的数据需要进行的增删改查的操作的定义了。

初学者不太理解没关系,可以先跳过,接下来进入主题部分,类的定义语法。

还是拿上一篇的需求来进行说明:

假如我们有一个研发团队,我们需要把每个打工人的数据存储下来,后续根据工作表现,进行入转调离的管理。

首先,我们这个需求的实体,主要就是打工人,假如我们的类名就是实体的拼音全拼:DaGongRen。

其次,我们来分析一下打工人应该有哪些属性特征,稍微简化一下,应该有工号、姓名、性别、年龄、薪资、状态。

然后,是打工人的动态行为,最主要的行为是打工,然后是加薪,还有离职。

直接看代码:

class DaGongRen:
    def __init__(self, no, name, age, gender, salary=10000, status='试用'):
        self.no = no
        self.name = name
        self.age = age
        self.gender = gender
        self.salary = salary
        self.status = status

    def work(self):
        print(f"工号:{self.no}的员工【{self.name}】在努力工作中")

    def salary_increase(self, inc=0):
        self.salary += inc

    def change_status(self, status):
        self.status = status

简单解释一下,我们在__init__方法中定义了类的相关对象属性,分别是工号、姓名、性别、年龄、薪资、状态。

__init__方法,可以理解为是固定写法,是用来进行对象的初始化的。

此外,还有work方法、salary_increase方法和change_status方法。

这些方面的第一个参数,习惯性写作self,表示要初始化或者操作的对象的引用,当然也可以改为其他名字,只是通常没有必要改动。

但是,这些代码执行完成,只是定义了一个打工人的类,不会有任何输出。

需要特别说明的是,相关的定义语法先这样记忆并使用,能进行解释的,后续的文章中会进行一定的展开,不能解释的,规定就是规定,没有必要去深究。

接下里,我们看怎么使用这个类。

对象实例化

我们前面提到过,类定义了对象的创建机制,也就是类的模板,我们通过类可以创建具体的对象,这个操作,也叫做对象实例化。

对象的实例化的语法很简单:

class DaGongRen:
    def __init__(self, no, name, age, gender, salary=10000, status='试用'):
        self.no = no
        self.name = name
        self.age = age
        self.gender = gender
        self.salary = salary
        self.status = status
        print(self)
        print('初始化完成')

    def work(self):
        print(f"工号:{self.no}的员工【{self.name}】在努力工作中")

    def salary_increase(self, inc=0):
        self.salary += inc

    def change_status(self, status):
        self.status = status


if __name__ == '__main__':
    dgr = DaGongRen('D001', '张三', 34, '男')
    print(dgr)
    print(dgr.name)
    dgr.work()

执行结果:

4f873b87c4313a707841db2a334e1b27.jpeg

简单解释一下,在Python中类也是一个callable对象,是可以类似于函数的()调用的,而实际上会将()中的参数传递给__init__方法,由于第一个参数self是不需要我们自行传递的,Python解释器会完成对象的引用到self参数的传递。我们可以通过__init__方法中的输出,跟对象引用的输出,看到这一点。

所以,实例化时()中的参数是传递给__init__方法的第二个及之后的参数的。

通过实例化,我们就获取了一个对象实例。我们可以通过.的操作,来访问对象的属性及方法。

012d45606a7f8b42e87bd82ef56a38db.jpeg

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

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

相关文章

2024 微信小程序 学习笔记 第二天

1. WXML 模板语法 数据绑定 事件绑定 条件渲染 列表渲染 2. WXSS 模板样式 rpx 样式导入 全局和局部样式 3. 全局配置 window tabBar 配置tabBar案例 4. 网络数据请求 Get请求 Post 请求 加载时请求 5. 案例 -本地生活(首页) 导航栏 轮播图 九宫格效果…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual ~Product() {}virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {st…

Ubuntu 22.04.4 LTS (linux) Tomcat 9 内存和线程优化

1 Apache Tomcat 9.0.91 线程 #在70行左右&#xff0c;增加如下 sudo vim /data/tomcat/conf/server.xmlmaxThreads"800" #客户请求最大线程数minSpareThreads"200" #最小线程数maxSpareThreads"500" #最大线程数acceptCount"800"…

unity2D游戏开发05摄像跟踪

图形设置 打开项目设置 选择Quality,关闭抗锯齿功能和各向异性纹理。 抗锯齿算法在对象的边缘上运行,并为其提供平滑的外观以补偿锯齿形状的输出效果,但我们不需要对像素艺术风格的2D游戏进行抗锯齿处理。 各向异性过滤是一种在使用特定类型的摄像机视角时提高图像质量的方…

单例模式_Golang

目录 一、单例模式 1.1 基本概念 1.2 使用场景 二、Golang实现 2.1 懒汉模式&#xff08;Lazy Loading&#xff09; 一、单例模式 1.1 基本概念 一个类只能生成一个实例&#xff0c;且该类能自行创建这个实例的一种模式,这个定义个人感觉可以拆的通俗一些,在项目的生命周…

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

Android中systrace配置及注意问题

Android中systrace配置及注意问题 systrace配置的官方文档地址如下&#xff1a;优化启动时间 Systrace systrace 允许在启动期间收集内核和 Android 跟踪记录。systrace 的可视化可以帮助分析启动过程中的具体问题。&#xff08;不过&#xff0c;如果要查看整个启动过程中的平…

抖音私信卡片跳转微信教程

以下是使用 W 外链制作抖音私信卡片跳转微信的一般教程&#xff1a; ​ **步骤一&#xff1a;准备工作** 1. 注册并登录 W 外链平台账号。 2. 并获取相关的链接或二维码。 **步骤二&#xff1a;创建跳转链接** 1. 在 W 外链平台中&#xff0c;选择创建新的跳转链接。 2.…

llama模型,nano

目录 llama模型 Llama模型性能评测 nano模型是什么 Gemini Nano模型 参数量 MMLU、GPQA、HumanEval 1. MMLU(Massive Multi-task Language Understanding) 2. GPQA(Grade School Physics Question Answering) 3. HumanEval llama模型 Large Language Model AI Ll…

基于MediaPipe的手部特征点识别

基于MediaPipe的手部特征点识别 MediaPipe简介 MediaPipe Solutions 提供了一套库和工具&#xff0c;可以在安卓或者windows应用中快速应用人工智能 (AI) 和机器学习 (ML) 技术。 MediaPipe 手部地标任务可检测图片中手部的特征点。识别效果如下 环境配置 python -m pip ins…

GRE VPN和MGRE VPN综合练习

GRE VPN和MGRE VPN综合练习 实验拓扑 实验要求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方; R3与R5之间使用HDLC封装;…

【vue3|第18期】Vue-Router路由的三种传参方式

日期:2024年7月17日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.408…

设计模式14-享元模式

设计模式14-享元模式 由来动机定义与结构代码推导特点享元模式的应用总结优点缺点使用享元模式的注意事项 由来动机 在很多应用中&#xff0c;可能会创建大量相似对象&#xff0c;例如在文字处理器中每个字符对象。在这些场景下&#xff0c;如果每个对象都独立存在&#xff0c…

「12月·长沙」第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)

随着科技的飞速发展&#xff0c;智能机器人在当今社会的重要性愈发凸显。从制造业的自动化生产线&#xff0c;到医疗领域的手术机器人&#xff0c;再到家庭生活中的智能助手&#xff0c;机器人与人工智能的融合正在改变着我们的生产和生活方式。第四届机器人、自动化与智能控制…

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间&#xff0c;是Ascensio System SIA公司出品的&#xff0c;基于Web的&#xff0c;开源的&#xff0c;跨平台的&#xff0c;在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套&#xff1a;文档编辑器、幻灯片编辑…

鸿蒙 动态共享包HSP的创建和引用

1.什么是动态共享包HSP HSP&#xff08;Harmony Shared Package&#xff09;是动态共享包&#xff0c;可以包含代码、C库、资源和配置文件&#xff0c;通过HSP可以实现代码和资源的共享。HSP不支持独立发布&#xff0c;而是跟随其宿主应用的APP包一起发布&#xff0c;与宿主应…

vue3前端开发-小兔鲜项目-form表单的统一校验

vue3前端开发-小兔鲜项目-form表单的统一校验&#xff01;实际上&#xff0c;为了安全起见&#xff0c;用户输入的表单信息&#xff0c;要满足我们的业务需求&#xff0c;参数类型等种种标准之后&#xff0c;才会允许用户向服务器发送登录请求。为此&#xff0c;有必要进行一次…

MySQL第四次作业

先创建库和表 处理表 1. 修改 student 表中年龄(sage)字段属性&#xff0c;数据类型由 int 改变为 smallint ALTER TABLE student MODIFY sage SMALLINT; 2. 为 Course 表中 Cno 课程号字段设置索引&#xff0c;并查看索引 ALTER TABLE course ADD INDEX index_cno (Cno); …

Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开

背景 在调研浏览器多开的过程中&#xff0c;electron 有自带的 browserview&#xff0c;webview&#xff0c;但是上面两个受制于 electron 内核版本限制&#xff0c;升级不够灵活&#xff0c;对新版的网页支持可能不及时&#xff0c;甚至不兼容&#xff0c;必须通过发布新的客…

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…