类方法,静态方法和实例方法的区别及应用场景
在 Python 中,有三种不同类型的方法:实例方法、类方法和静态方法。它们各自有不同的特点和应用场景:
- 实例方法(Instance Method):
- 实例方法是最常见的方法类型,在方法定义中第一个参数通常被命名为
self,代表对类实例的引用。 - 实例方法可以访问并操作实例的属性,并且可以通过
self参数来调用其他实例方法。 - 应用场景:当需要操作或者修改对象的属性时,通常会使用实例方法。实例方法可以直接访问实例的属性,并且可以操作实例的状态。
- 实例方法是最常见的方法类型,在方法定义中第一个参数通常被命名为
class MyClass:def instance_method(self):# 这是一个实例方法self.some_attribute = "some value"return self.some_attributeobj = MyClass()
print(obj.instance_method()) # 调用实例方法
- 类方法(Class Method):
- 类方法使用
@classmethod装饰器进行修饰,第一个参数通常被命名为cls,代表对类的引用。 - 类方法可以访问类的属性,并且可以通过
cls参数调用其他类方法。 - 应用场景:当需要操作类的属性而不是实例的属性时,通常会使用类方法。类方法可以用于创建工厂方法、修改类属性等场景。
- 类方法使用
class MyClass:class_attribute = "class value"@classmethoddef class_method(cls):# 这是一个类方法return cls.class_attributeprint(MyClass.class_method()) # 调用类方法
- 静态方法(Static Method):
- 静态方法使用
@staticmethod装饰器进行修饰,它不需要表示自身对象的self或者类的cls参数。 - 静态方法不能访问类的属性,也不能访问实例的属性,因此它与类和实例无关。
- 应用场景:当一个方法在逻辑上与类相关,但是并不需要访问类或实例的属性时,通常会使用静态方法。静态方法通常用于封装通用的功能性方法。
- 静态方法使用
class MyClass:@staticmethoddef static_method():# 这是一个静态方法return "This is a static method"print(MyClass.static_method()) # 调用静态方法
总结:
- 实例方法主要用于操作实例的状态和行为;
- 类方法主要用于操作类的属性和提供类级别的操作;
- 静态方法主要用于封装与类相关的功能性方法,但不需要访问类或实例的属性。
补充:应用场景具体举例
当涉及到实例方法、类方法和静态方法的具体应用场景时,以下是一些常见的示例:
- 实例方法的应用场景:
- 在一个银行账户类中,实现一个实例方法
deposit和withdraw,用于增加和减少账户余额,这些方法需要访问和修改实例的属性(比如账户余额)。 - 在一个学生类中,实现一个实例方法
calculate_grade,用于根据考试成绩计算学生的最终成绩,这个方法需要访问学生的考试成绩属性。
- 在一个银行账户类中,实现一个实例方法
class BankAccount:def __init__(self, balance):self.balance = balancedef deposit(self, amount):self.balance += amountdef withdraw(self, amount):if self.balance >= amount:self.balance -= amountelse:print("Insufficient funds")account = BankAccount(100)
account.deposit(50)
account.withdraw(30)
print(account.balance) # 输出:120
- 类方法的应用场景:
- 在一个日期类中,实现一个类方法
from_string,用于从字符串中解析出日期对象,这个方法不需要访问实例的属性,但需要对日期类进行操作。 - 在一个数据库连接类中,实现一个类方法
create_connection,用于创建数据库连接,这个方法可以在不需要具体数据库实例的情况下使用。
- 在一个日期类中,实现一个类方法
class Date:def __init__(self, year, month, day):self.year = yearself.month = monthself.day = day@classmethoddef from_string(cls, date_str):year, month, day = map(int, date_str.split('-'))return cls(year, month, day)date = Date.from_string('2023-11-19')
print(date.year, date.month, date.day) # 输出:2023 11 19
当在一个数据库连接类中实现一个类方法 create_connection 用于创建数据库连接时,可以使用类方法来实现这一功能。以下演示了如何在 Python 中使用类方法创建数据库连接:
import sqlite3class DatabaseConnection:@classmethoddef create_connection(cls, database_file):connection = sqlite3.connect(database_file)return connection# 调用类方法创建数据库连接
connection = DatabaseConnection.create_connection('example.db')# 使用连接执行 SQL 查询
cursor = connection.cursor()
cursor.execute("SELECT * FROM some_table")
rows = cursor.fetchall()# 关闭连接
connection.close()
在上面的示例中,我们定义了一个名为 DatabaseConnection 的类,其中包含一个类方法 create_connection。这个类方法接收一个参数 database_file,表示数据库文件的路径,然后使用 sqlite3 模块创建数据库连接并返回该连接对象。
通过调用 DatabaseConnection.create_connection('example.db'),我们可以在不需要创建 DatabaseConnection 的实例的情况下,直接使用类方法创建数据库连接。这样就非常方便地实现了数据库连接的创建,而无需实例化整个类。
需要注意的是,以上示例使用的是 Python 内置的 sqlite3 模块作为演示,实际应用中的数据库连接方式可能会根据具体的数据库系统而有所不同,例如 MySQL、PostgreSQL、MongoDB 等。因此,在实际开发中,需要根据所使用的数据库系统选择相应的数据库连接库,并按照该库的使用方式来实现类方法 create_connection。
- 静态方法的应用场景:
- 在一个数学计算类中,实现一个静态方法
add,用于执行两个数的加法运算,这个方法与具体的实例和类无关。 - 在一个文件工具类中,实现一个静态方法
validate_file_name,用于验证文件名是否合法,这个方法仅仅是提供了一些通用的文件名验证功能。
- 在一个数学计算类中,实现一个静态方法
class MathUtils:@staticmethoddef add(x, y):return x + yresult = MathUtils.add(3, 5)
print(result) # 输出:8
通过上述示例,可以清晰地看到实例方法、类方法和静态方法在不同场景下的应用,并且理解它们各自的作用和优势。
相关文章:
类方法,静态方法和实例方法的区别及应用场景
在 Python 中,有三种不同类型的方法:实例方法、类方法和静态方法。它们各自有不同的特点和应用场景: 实例方法(Instance Method): 实例方法是最常见的方法类型,在方法定义中第一个参数通常被命…...
CleanMyMac X4.16免费版mac电脑一键清理电脑垃圾工具
但是,我最近发现随着使用时间的增加,一些奇奇怪怪的文件开始占据有限的磁盘空间,存储空间变得越来越小,系统占用空间越来越大,越来越多的无效文件开始影响我电脑的运行速度。 Mac的文件管理方式和Windows不太一样&…...
汽车级低压差稳压器LDO LM317BD2TR4G原理、参数及应用
LM317BD2TR4G主要功能特性分析 : LM317BD2TR4G 低漏 (LDO) 线性电压稳压器是一款可调 3 端子正向 LDO 电压器,能够在 1.2 V 至 37 V 的输出电压范围内提供 1.5 A 以上的电流。此电压稳压器使用非常简便,仅需两个外部电阻即可设置输出电压。另…...
多对多的创建方式与Ajax
模型层补充 MTV与MVC模型 MTV 全称 Models Templates Views 模型模板视图 MVC 全称 Models Views Controller 模型视图控制MTV: Django号称是MTV模型 MVC: 其实django本质也是MVC 拓展: vue框架:MVVM模型choices参数(数据库字段设计常见) choices使用 class User(models.Mod…...
【Linux网络】详解使用http和ftp搭建yum仓库,以及yum网络源优化
目录 一、回顾yum的原理 1.1yum简介 yum安装的底层原理: yum的好处: 二、学习yum的配置文件及命令 1、yum的配置文件 2、yum的相关命令详解 3、yum的命令相关案例 三、搭建yum仓库的方式 1、本地yum仓库建立 2、通过http搭建内网的yum仓库 3、…...
算法设计与分析算法实现——动态规划最大子段
输入:整数序列a1,a2,…,an 输出:序列的一个子段,其和Σak最大 注意:当所有整数都为负数时,定义最大子段和为0 使用动态规划,输入数组是a[n]; 状态转移方程dp[i]max(dp[i-1]a[i],a[i])——这个状…...
JavaWeb-JVM内存管理机制
JavaWeb-JVM内存管理机制 一、JVM内存管理概述1.1 什么是JVM内存管理1.2 物理内存与虚拟内存1.3 内核空间与用户空间二、java中哪些组建需要使用内存2.1 Java堆2.2 线程2.3 类和类加速器2.4 NIO2.5 JNI三、JVM内存结构3.1 PC寄存器3.2 Java栈3.3 堆3.4 方法区3.5 运行时常量池3…...
阿里云oss存储文件上传功能实现(保姆级教程)
先登录: 点击进入控制台 点击左上角导航栏按钮 搜索oss,点击进入 进入之后点击立即开通oss按钮,开通之后点击下图立即创建,弹出创建Bucket 填上Bucket名称,读写权限改为公共读。其他不变点击确定创建,完成…...
centos7配置 局域网自动解析hostname
这样可以让局域网别的电脑直接通过hostname来连接这台电脑。 如果不是windows系统,可以用hostname.local来连接 主要是用到了mdns的功能,需要安装nss-mdns。 vmware下nat模式下,宿主机也可以通过连接hostname使用。 yum install epel-releas…...
wireshark 过滤设置
gpt: Wireshark 是一个网络分析工具,可以用来捕获和分析网络数据包。你可以使用过滤器来筛选并查看你感兴趣的数据包。Wireshark 使用的是基于BPF(Berkeley Packet Filter)语法的过滤器。以下是一些常见的 Wireshark 过滤器设置:…...
SpringBoot-过滤器Filter+JWT令牌实现登录验证
登录校验-Filter 分析 过滤器Filter的快速入门以及使用细节我们已经介绍完了,接下来最后一步,我们需要使用过滤器Filter来完成案例当中的登录校验功能。 我们先来回顾下前面分析过的登录校验的基本流程: 要进入到后台管理系统,我…...
VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)
目录 一、服务器信息二、192.168.132.35服务器上安装mysql(主)2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 三…...
python 实现蚁群算法(simpy带绘图)
这里使用了蚁群算法求解了旅行商问题,同时结合了simpy来绘图 选择下一个食物的函数为: probability[i] pheromone[self.now][self.not_to_foods[i]] ** pheromone_w (1 / distance[self.now][self.not_to_foods[i]]) ** distance_w 该条路概率权重该点…...
OpenAI 董事会宫斗始作俑者?一窥伊尔亚·苏茨克维内心世界
OpenAI 董事会闹剧应该是暂告一个段落了,Sam Altman和Greg Brockman等一众高管均已加入微软,还有员工写联名信逼宫董事会的戏码,关注度已经降下来了。 但是,这场宫斗闹剧的中心人物Ilya Sutskever大家关注度不算太高。他本人是纯粹的技术男,极少抛头露面透露其内心世界。…...
Android App 启动状态有几种?
startup state Android 启动状态(startup state)1.1、冷启动(Cold Start)1.2、温启动(Warm Start)1.3、热启动(Hot Start)1.4、后台启动(Background Start) 优…...
Spring Cloud Alibaba Sentinel 简单使用
Sentinel Sentinel 主要功能Sentinel 作用常见的流量控制算法计数器算法漏桶算法 令牌桶算法Sentinel 流量控制Sentinel 熔断Sentinel 基本使用添加依赖定义资源定义限流规则定义熔断规则如何判断熔断还是限流自定义 Sentinel 异常局部自定义异常全局自定义异常系统自定义异常…...
nvm切换node后,没有npm
当我们想要在不同的 Node.js 版本之间切换的时候,通常会使用 nvm(Node Version Manager) 来完成。但是,当我们在使用 nvm 切换 Node.js 版本的时候,可能会遇到没有 npm 的情况。这种情况通常发生在我们在新环境或者重新…...
Redis-高性能原理剖析
redis安装 下载地址:http://redis.io/download 安装步骤: # 安装gcc yum install gcc# 把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3.tar…...
ORA-00600 【3948】,ORA-00600 【3949】
前言 这个报错没有从ORA600那个tool中查到。 回顾 环境 环境是windows 11203 rac环境,非归档数据库 有部分数据文件建到了本地文件系统。目标是将部分数据文件通过switch to copy的形式移动到diskgroup里 流程 srvctl关闭双节点, 启动单节点到moun…...
flink 查看写入starrocks的数据量 总行数
针对该connector: https://github.com/StarRocks/docs.zh-cn/blob/main/loading/Flink-connector-starrocks.md...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...
7种分类数据编码技术详解:从原理到实战
在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类…...
