# 06_Python基础到实战一飞冲天(三)-python面向对象(六)--类属性和类方法和单例

06_Python基础到实战一飞冲天(三)-python面向对象(六)–类属性和类方法和单例

一、类属性-05-使用对象名+类属性赋值语句会创建实例属性

1、使用对象名访问类属性的问题注意

  • 如果使用 对象.类属性 = 值 赋值语句,只会 给对象添加一个属性,而不会影响到 类属性的值

2、使用对象名访问类属性的问题 示例 代码(dzs_14_使用对象名访问类属性的问题.py):

# dzs_14_使用对象名访问类属性的问题.pyclass Tool(object):# 使用赋值语句,定义类属性,记录创建工具对象的总数count = 0def __init__(self, name):self.name = name# 针对类属性做一个计数+1Tool.count += 1# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁锹")# 如果使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值
tool1.count = 99
print("这是对象 count = %d " % tool1.count)# 通过类名访问类属性
print("现在创建了 %d 个工具类" % Tool.count)

3、示例:

在这里插入图片描述

二、类方法-01-基本语法

1、类方法

1)类属性 就是针对 类对象 定义的属性。
* 使用 赋值语句class 关键字下方可以定义 类属性
* 类属性 用于记录 与这个类相关 的特征。

2)类方法 就是针对 类对象 定义的方法
* 在 类方法 内部可以直接访问 类属性 或者调用其他的 类方法

3)类方法语法如下

@classmethod
def 类方法名(cls):pass

2、类方法 语法 说明:

1)类方法需要用 修饰器 @classmethod 来标识,告诉解释器这是一个类方法

2)类方法的 第一个参数 应该是 cls

* 由 **哪一个类** 调用的方法,方法内的 `cls` 就是 **哪一个类的引用**。
* 这个参数和 **实例方法** 的第一个参数是 `self` 类似。
* **提示** 使用其他名称也可以,不过习惯使用 `cls`。

3)通过 类名. 调用 类方法调用方法时,不需要传递 cls 参数

4)在方法内部
* 可以通过 cls. 访问类的属性
* 也可以通过 cls. 调用其他的类方法

三、类方法-02-案例演练

1、类方法示例需求

1)定义一个 工具类
2)每件工具都有自己的 name
3)需求 —— 在 封装一个 show_tool_count 的类方法,输出使用当前这个类,创建的对象个数。

在类方法内部,可以直接使用 cls 访问 类属性 或者 调用类方法

在这里插入图片描述

2、类方法 示例 代码(dzs_15_类方法.py):

#  dzs_15_类方法.pyclass Tool(object):# 使用赋值语句,定义类属性,记录创建工具对象的总数count = 0@classmethoddef show_tool_count(cls):"""显示工具对象的总数"""print("工具类的总数 %d" % cls.count)def __init__(self, name):self.name = name# 针对类属性做一个计数+1Tool.count += 1# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
# tool3 = Tool("铁锹")# 如果使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值
tool1.count = 9
print("这是对象 count = %d " % tool1.count)# 通过类名访问类方法
Tool.show_tool_count()

3、示例:

在这里插入图片描述

四、静态方法-01-应用场景和定义方式

1、 静态方法

1)在开发时,如果需要在 中封装一个方法,这个方法:

* 既 **不需要** 访问 **实例属性** 或者调用 **实例方法**。
* 也 **不需要** 访问 **类属性** 或者调用 **类方法**。

2)这个时候,可以把这个方法封装成一个 静态方法

3)静态方法语法如下

@staticmethod
def 静态方法名():pass

4)静态方法 需要用 修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法

5)通过 类名. 调用 静态方法

2、静态方法 示例 代码(dzs_16_静态方法.py):

# dzs_16_静态方法.pyclass Dog(object):@staticmethoddef run():# 不需要访问实例属性也不需要访问类属性的方法print("狗在跑...")# 通过 类名. 静态方法名 调用静态访求,不需要创建对象
Dog.run()

3、示例:

在这里插入图片描述

五、方法综合-01-案例分析

1、方法综合案例:需求分析

1)设计一个 Game 类。

2)属性:
* 定义一个 类属性 top_score 记录游戏的 历史最高分
* 定义一个 实例属性 player_name 记录 当前游戏的玩家姓名

3) 方法:
* 静态方法 show_help 显示游戏帮助信息。
* 类方法 show_top_score 显示历史最高分。
* 实例方法 start_game 开始当前玩家的游戏。

4)主程序步骤
* 1) 查看帮助信息。
* 2) 查看历史最高分。
* 3) 创建游戏对象,开始游戏。

2、方法综合案例 类和方法示例图:

在这里插入图片描述

六、方法综合-02-案例演练

1、方法综合案例演练 示例 代码(dzs_17_方法综合案例.py):

# dzs_17_方法综合案例class Game(object):"""Game"""# 游戏最高分,类属性top_score = 0def __init__(self, player_name):self.player_name = player_name@staticmethoddef show_help():print("帮助信息:让僵尸走进房间")@classmethoddef show_top_score(cls):print("游戏最高分 high score: %d " % cls.top_score)def start_game(self):print("[%s] 开始游戏..." % self.player_name)# 使用类名.修改历史最高分Game.top_score = 999# 1. 查看游戏帮助
Game.show_help()# 2. 查看游戏最高分
Game.show_top_score()# 3. 创建游戏对象,开始游戏
game = Game("小明")game.start_game()# 4. 游戏结束,查看游戏最高分
Game.show_top_score()

2、示例:

在这里插入图片描述

七、方法综合-03-确定方法类型的套路

1、方法综合案例小结

1)实例方法 —— 方法内部需要访问 实例属性
* 实例方法 内部可以使用 类名. 访问类属性。

2) 类方法 —— 方法内部 需要访问 类属性

3)静态方法 —— 方法内部,不需要访问 实例属性类属性

2、提问

如果方法内部 即需要访问 实例属性,又需要访问 类属性,应该定义成什么方法?

答案

1)应该定义 实例方法
2)因为,类只有一个,在 实例方法 内部可以使用 类名. 访问类属性。

八、单例-01-设计模式和单例设计模式概念

1、单例学习 目标

  • 单例设计模式
  • __new__ 方法
  • Python 中的单例

2、设计模式

1)设计模式前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案。

2)使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

3、单例设计模式

1)单例目的 —— 让 创建的对象,在系统中 只有 唯一的一个实例

2)每一次执行 类名() 返回的对象,内存地址是相同的

4、单例设计模式的应用场景

1)音乐播放 对象
2)回收站 对象
3)打印机 对象

九、单例-02-new方法的作用

1、 __new__ 方法

1)使用 类名() 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间

2) __new__ 是一个 由 object 基类提供的 内置的静态方法,主要作用有两个:

* 1) 在内存中为对象 **分配空间**。
* 2) **返回** 对象的引用。

3) Python 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给 __init__ 方法。

重写 __new__ 方法 的代码非常固定!

4)重写 __new__ 方法 一定要 return super().__new__(cls)

  • 否则 Python 的解释器 得不到 分配了空间的 对象引用就不会调用对象的初始化方法

5)注意:__new__ 是一个静态方法,在调用时需要 主动传递 cls 参数。

2、对象分配空间和初始化 示例图:

在这里插入图片描述

十、单例-03-重写new方法

1、单例 示例代码(dzs_18___new__方法.py):

# dzs_18___new__方法.pyclass MusicPlayer(object):def __new__(cls, *args, **kwargs):# 1.创建对象时,new方法会被自动调用print("创建对象,分配空间")# 2.为对象分配空间instance = super().__new__(cls)# 3.返回对象的引用。如果不返回任何结果,初始化方法就拿不到内存地址return instancedef __init__(self):print("初始化音乐播放对象")player = MusicPlayer()
print(player)

2、示例:

在这里插入图片描述

上一节关联链接请点击:

05_Python基础到实战一飞冲天(三)-python面向对象(五)–多继承多态和类属性

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【目标跟踪】DUT Anti-UAV数据集详细介绍

DUT Anti-UAV数据集是大连理工大学的团队公开的数据集(DUT是他们学校的简称),其中包括了两个子数据集:目标检测和目标跟踪(也就是说,目标检测和目标跟踪都可以用这个数据集)。该数据集为可见光模…

★ 数据结构 ★ 排序

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习数据结构中的各种排序~ ​❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 数据结构专栏&#xff1a;https://blog.csdn.net/2302_80328146/categ…

c语言基础三:运算符和表达式

一、常用的运算符分类 运算符类型 作用 算术运算符 用于处理四则运算 赋值运算符 用于将表达式的值赋给变量 比较运算符 用于表达式的比较&#xff0c;并返回一个真值或假值 逻辑运算符 用于根据表达式的值返回真值或假值 位运算符 用于处理数据的位运算 s…

如何通过金蝶云星空高效集成销售出库单

金蝶云星空数据集成案例分享&#xff1a;销售出库单-&#xff08;分销&京东&唯品&虚拟除外&#xff09;手表汇总 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是业务运作的关键。本文将聚焦于一个具体的系统对接集成案例&#xff0c;即如何将金蝶云星…

【SKFramework框架核心模块】3-4、事件模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

鸿蒙分享:添加模块,修改app名称图标

新建公共模块common 在entry的oh-package.json5添加dependencies&#xff0c;引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&#xff1a; common--src--resources--string.json 新增&#xff1a; {"name&q…

逆向攻防世界CTF系列48-Signin.md

逆向攻防世界CTF系列48-Signin.md 直接定位 输入&#xff0c;然后跟踪96A 一个整数一个余数你会发现这是把输入字符变成两个分开的十六进制存储起来&#xff0c;比如输入字符 ‘1’ &#xff0c;它的整数是49&#xff0c;49除16的整数是3&#xff0c;余数是1&#xff0c;在byt…

最新版Chrome谷歌加载ActiveX控件之金格iWebOffice2015控件

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

Lakehouse 架构下的元数据“大一统”管理深度解析

在湖仓一体&#xff08;Lakehouse&#xff09;出现之前&#xff0c;数据仓库和数据湖堪称数据领域的两大“顶流”。打个比方&#xff0c;要是把数据仓库比作一座大型图书馆&#xff0c;那其中的数据就如同馆内藏书&#xff0c;需要按照规范放好&#xff0c;借阅者只需依照类别索…

【AI系统】MobileVit 系列

MobileVit 系列 自 Vision Transformer 出现之后&#xff0c;人们发现 Transformer 也可以应用在计算机视觉领域&#xff0c;并且效果还是非常不错的。但是基于 Transformer 的网络模型通常具有数十亿或数百亿个参数&#xff0c;这使得它们的模型文件非常大&#xff0c;不仅占…

投稿指南——论文检索报告如何开具

【SciencePub学术】论文发表被SCI数据库收录之后&#xff0c;作为学术成果上报时&#xff0c;一般需要提供论文检索报告&#xff0c;SCI论文检索报告怎么开&#xff1f;在哪开&#xff1f;要注意什么&#xff1f;这些问题&#xff0c;本期小编给大家解答一下。 Q 开具检索报告…

Jenkins 推送报错 - SSH 密钥失效

目录 问题描述报错原因解决方案 问题描述 jenkins 构建完毕后&#xff0c;将构建好的 jar 包推送至远端服务器时&#xff0c;Deploy 阶段报如下错误&#xff1a; sshpass -p **** scp -o StrictHostKeyCheckingno -P 22 -r /data/jenkins/workspace/TAI/TAI/AllCam-tai-cloud/…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软&#xff1a; 代码链接&#xff1a;ODIN: A Single Model For 2D and 3D Perception 论文链接&#xff1a;2401.02416 摘要 这篇论文介绍了ODIN&#xff08;Omni-Dimensional INstance segmentation&#xff09;&#xff0c;一个能够同时处理2D RGB图像和3D点云…

三、代码管理-Git

文章目录 前言一、Git1. Git 与 SVN 区别2. Git 入门3. 客户端工具4. 主流Git仓库 二、GitLab1. 介绍2. 适合的场景 二、GitHub1. 介绍2. 适合的场景 三、Gitee1. 介绍2. 适合的场景 四、GitCode1. 介绍2. 适合的场景 五、总结 前言 代码托管‌ Git作为目前最为流行的版本控制…

npm, yarn, pnpm之间的区别

前言 在现代化的开发中&#xff0c;一个人可能同时开发多个项目&#xff0c;安装的项目越来越多&#xff0c;所随之安装的依赖包也越来越臃肿&#xff0c;而且有时候所安装的速度也很慢&#xff0c;甚至会安装失败。 因此我们就需要去了解一下&#xff0c;我们的包管理器&#…

vscode上传本地文件到服务器

vscode上传本地文件到服务器 首先下载插件SFTP&#xff0c;我们通过ftp进行文件传输 VScode打开要传输的文件 使用快捷键 ctrlshiftP 打开搜索窗口&#xff0c;搜索SFTP 点击之后vscode文件夹下会生成对应json文件 我们编辑json信息根据远程的服务器情况填写&#xff0c;比如…

Next.js 实战 (二):搭建 Layouts 基础排版布局

前言 等了许久&#xff0c;Next.js 终于迎来了 v15.x 版本&#xff0c;刚好 Github 上面的旧项目重构完&#xff0c;终于可以放心大胆地去研究 Next.js了。 搭建最新项目可以参考官方文档&#xff1a;Installation 最新的 Next.js 版本&#xff0c;使用的是 React19.x 内测版…

Java的Stirng、StringBuilder、StringJoiner

黑马程序员Java个人笔记 目录 字符串比较 比较 boolean equals boolean equalsIgnoreCase 键盘录入和定义的字符串的比较 StringBuilder 打印 ​编辑 添加元素 反转 获取长度 toString 练习 对称字符串 拼接字符串 StringJoiner 概述 ​编辑 构造方法 只有…

elasticsearch(三)

文章目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法 1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.实现酒店搜…

Python_Flask03

这篇文章主要介绍的是数据库的增删改查操作&#xff0c;无多余好说的。 from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text from flask_migrate import Migrateapp Flask(__name__)# 本地基础信息的主机名 HOSTNAME "127.0…