测试开发通关秘籍四: 彻底搞懂实例方法,类方法和静态方法

热爱技术的小牛

测试开发通关秘籍四: 彻底搞懂实例方法,类方法和静态方法

在 Python 中,实例方法、静态方法和类方法是定义在类中的三种方法类型。它们之间的主要区别在于它们如何访问类的属性和方法。以下是它们的详细定义、区别以及适合的使用场景。

1. 实例方法 (Instance Method)

  • 定义:实例方法是使用 self 作为第一个参数的方法,属于类的实例对象。它可以访问和修改实例变量。
  • 访问:可以访问类的实例变量和其他实例方法,通常用于处理与实例对象相关的数据。
  • 使用场景:当方法需要访问或操作实例属性时,使用实例方法。

示例代码

class MyClass:def __init__(self, value):self.value = value  # 实例变量# 实例方法def instance_method(self):# 通过 self 访问实例属性print(f"Instance method called. Value is {self.value}")# 可以修改实例属性self.value += 10# 创建类的实例
obj = MyClass(5)
obj.instance_method()  # 调用实例方法
print(obj.value)  # 输出修改后的值

输出

Instance method called. Value is 5
15

解释

  • instance_method 是一个实例方法,它通过 self 访问和修改 value 属性。
  • 创建类的实例 obj 后,调用 obj.instance_method(),打印当前值并将其增加 10。

2. 静态方法 (Static Method)

  • 定义:静态方法使用 @staticmethod 装饰器定义,不会隐式传入 selfcls 参数。它与类没有直接关系,仅是组织在类中的独立函数。
  • 访问:无法直接访问实例属性或类属性。
  • 使用场景:当一个方法不依赖于实例或类的任何属性,但逻辑上与类关联时,使用静态方法。通常用于工具函数或操作类相关数据的辅助方法。

示例代码

class MyClass:# 静态方法@staticmethoddef static_method():print("Static method called. This method doesn't access any instance or class variable.")# 实例方法调用静态方法def example(self):print("Calling static method from instance method:")MyClass.static_method()  # 静态方法直接通过类名调用# 调用静态方法,不需要创建类实例
MyClass.static_method()# 也可以通过实例调用静态方法
obj = MyClass()
obj.static_method()
obj.example()  # 在实例方法中调用静态方法

输出

Static method called. This method doesn't access any instance or class variable.
Static method called. This method doesn't access any instance or class variable.
Calling static method from instance method:
Static method called. This method doesn't access any instance or class variable.

解释

  • static_method 是一个静态方法,用于执行与类无关的操作,像一个普通函数。
  • 可以通过 MyClass.static_method() 调用静态方法,也可以在实例方法中调用它(如 example 方法中所示)。

3. 类方法 (Class Method)

  • 定义:类方法使用 @classmethod 装饰器定义,接收 cls 参数,表示调用此方法的类本身。
  • 访问:可以访问和修改类变量(而不是实例变量)。
  • 使用场景:当需要在方法中使用类级别的数据,或创建一个返回类实例的工厂方法时,使用类方法。

示例代码

class MyClass:count = 0  # 类变量,用于统计实例数量def __init__(self, value):self.value = valueMyClass.count += 1  # 每创建一个实例,类变量 count 增加# 类方法@classmethoddef get_instance_count(cls):# 使用 cls 访问类变量print(f"Total instances created: {cls.count}")# 工厂方法@classmethoddef create_with_double_value(cls, value):# 返回一个实例,value 值加倍return cls(value * 2)# 创建实例并查看实例数量
obj1 = MyClass(10)
obj2 = MyClass(20)
MyClass.get_instance_count()  # 输出当前创建的实例数量# 使用类方法作为工厂方法
obj3 = MyClass.create_with_double_value(15)
print(obj3.value)  # 输出 30
MyClass.get_instance_count()  # 查看实例数量

输出

Total instances created: 2
30
Total instances created: 3

解释

  • get_instance_count 是一个类方法,通过 cls 访问类变量 count,显示创建的实例总数。
  • create_with_double_value 是一个工厂方法类方法,返回一个新实例,将传入的值加倍赋予 value

总结

方法类型 定义 特点 适用场景
实例方法 def method(self): 可访问实例和类变量,需实例化对象调用 处理实例数据或行为
静态方法 @staticmethod selfcls,无法访问实例或类变量 工具方法,不依赖实例或类数据
类方法 @classmethod cls 作为参数,可访问或修改类变量 操作类级数据,或作为工厂方法返回类的新实例

这些方法可以让类更灵活,根据操作需求来选择不同的类型,有效提高代码的可读性和复用性。

关注我

简书 | CSDN | 知乎 | 博客园| 公众号合集:热爱技术的小牛
热爱技术的小牛

本文由mdnice多平台发布

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

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

相关文章

20222403 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1. 实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用…

高级语言程序设计第五次个人作业(102400106 刘鑫语)

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第五次个人作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13298 学号:102400106 姓名:刘鑫语 第八章 尝试了很多次都不能以EOF终止,换成了& 8.1 8.2知道了\040\为八进制转…

c#-设计模式之观察者模式

c#-设计模式之观察者模式 概念 指多个对象之间存在一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。该模式又称为包括发布-订阅(Publish/Subscribe)模式,该模式是行为型模式。 结构图角色Subject(观察目标):观察目标是指被观…

运动的时钟

#include <graphics.h> #include <conio.h> #include <math.h> #define Width 640 #define Height 480 #define PI 3.14159 int main() {// 初始化绘图窗口initgraph(640, 480, SHOWCONSOLE);//秒针起始坐标int center_x = Width / 2, center_y = Height / 2…

Python装饰器在接口测试中常用场景

日志记录 异常捕获与记录 解决Case间依赖 记录Case执行时间以记录Case执行时间为例:

20222401 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 1.1基本概念 1.1.1什么是恶意代码 首先,恶意代码是一串实现特定功能的代码,而特定功能在这里特指具有恶意目的的功能实现,可以理解为按照攻击者的意愿进行运行的代码。 按照特征以及行为的不同,大概分为以下几类:计算机病毒 蠕虫(病毒) 后门 木马 僵尸网络 R…

目录提取,删除,添加

目录提取目录删除目录制作目录效果图 目前有两个问题,一般的目录文本格式有问题,需要用正则化方式,生成比较好的目录文件,比如csv格式,txt格式 另外,生成的目录,层级只有一级 提取目录import fitz # PyMuPDF import pandas as pd# 打开PDF文件 pdf_path = 力学概论.pdf…

2023 国际大学生程序设计竞赛亚洲区域赛(济南站)(SMU Autumn 2024 Team Round 2)

2023 国际大学生程序设计竞赛亚洲区域赛(济南站)(SMU Autumn 2024 Team Round 2) I. Strange Sorting 思路代码查看代码 #include #define ll __int128 #define int long long #define double long double #define PII pair using namespace std; const int N = 2E5 + 3; …

MyBatis-Plus快速入门:从安装到第一个Demo

本文将带你从零开始,快速入门 MyBatis-Plus。我们将首先介绍如何安装和配置 MyBatis-Plus,然后通过一个简单的示例演示如何使用它进行数据操作。无论你是 MyBatis 的新手还是希望提升开发效率的老手,本文都将为你提供清晰的指导和实用的技巧。一、前言 在现代 Java 应用程序…

docker bulid tag push到自己的docker hub 仓库

-t(或 --tag)参数:用于给构建的镜像指定标签(tag)。标签的格式通常是 [仓库名/][用户名/]镜像名:版本号 -f(或 --file)参数: 指定构建镜像所使用的 Dockerfile 的路径。默认情况下,docker build 会在当前目录下查找名为 Dockerfile 的文件,但通过这个参数可以指定其他…

《使用Gin框架构建分布式应用》阅读笔记:p393-p437

《用Gin框架构建分布式应用》学习第17天,p393-p437总结,总45页。 一、技术总结 1.Prometheus Prometheus放在代码里面使用,还是第一次见。在本人实际的工作中未看到这种用法。 2.Grafana Grafana用于被监控数据的可视化。 3.Telegraf Telegraf用于数据采集。在本人的实际工作…

2024.11.3 鲜花

浅谈 RMQ浅谈 RMQ비밀 인형극 II어느 한적한 마을 골목 안의 허름한 건물在某个僻静村庄胡同的破旧建筑里문을 열고 들어가면 작은 극장이 있죠开门进去便会见到一个小剧场솜씨 좋은 인형사가 연극을 마치고 떠나면一个手艺不错的人偶师演完戏离开的时候인형들은 극장 창고 안에…