Python中的@staticmethod和@classmethod装饰器

news2024/7/2 3:49:57

名词解释

本文主要介绍静态方法@staticmethod和类方法@classmethod在类中的应用,在介绍这两个函数装饰器之前,先介绍类中的几个名词,便于后面的理解:

类对象:定义的类就是类对象

类属性:定义在__init__ 外部的变量

类方法:定义在类中,且被@classmethod 装饰的方法

实例对象:类对象实例化后就是实例对象

实例属性:定义在__init__内部带有self.的变量

实例方法:定义在类对象中,且未被@classmethod装饰的方法就是实例方法

静态方法:定义在类中,且被@staticmethod 装饰的方法

 

直观的解释见下图:

 

@staticmethod用法

@staticmethod用于标记一个方法为静态方法。静态方法不接收类的实例(self)或类(cls)作为第一个参数,不需要对类实例化,可以直接被调用,但不能访问类或实例属性。

在pytorch的Function类中,虽然申明forward和backward为静态方法,但是这里均接受ctx上下文对象,用于保存和访问两者之间传递的信息。

静态方法:

class Func:
    @staticmethod
    def add(x, y):
        return x + y

# 使用静态方法
result = Func.add(3, 4)

实例化方法:

class Func:
    def add(self, x, y):
        return x + y

result = Func() # 实例化
result.add(3, 4)

既然两种方法效果一样,且实例方法的功能比静态方法更丰富,为何还需要在类下面搞一个多此一举的静态方法?

原因如下:

将独立的函数打包装在类下面,使代码更加组织化和模块化。
可以在类下面创建独立于类实例的函数。


@classmethod用法

在函数前面加@classmethod,表明该方法是类方法,无需实例化可以被直接调用,但是需要接受cls作为第一个参数传入。

需要注意的是,一旦实例方法前面被加了@classmethod,该实例方法的级别就从二级跃升到一级,与类是一个级别。(假设类是一级,类下面的实例方法是二级。)

因此,类方法不能调用实例属性和实例方法,只能调用类属性和类方法。但是,实例方法可以调用类属性和类方法。

案例1:类方法的简单应用

class ExampleClass:
    class_variable = 10
    print('类属性:', class_variable)

    @classmethod
    def class_method(cls, x):
        y = cls.class_variable + x
        return y

print('----- 调用类方法 --------')
y = ExampleClass.class_method(100)
print('类方法输出:',y)
print('----- 类方法调用结束 -----')

输出:

类属性: 10
----- 调用类方法 --------
类方法输出: 110
----- 类方法调用结束 -----

与实例化方法对比:

class ExampleClass:
    class_variable = 10
    print('类属性:', class_variable)

    @classmethod
    def class_method(cls, x):
        y = cls.class_variable + x
        return y

exampleclass = ExampleClass()
y = exampleclass.class_method(100)
print(y)

输出:

类属性: 10
110

案例2:类方法作为工厂方法

class Vehicle:
    def __init__(self, vehicle_type):
        self.vehicle_type = vehicle_type
        print('初始化实例属性:',self.vehicle_type)

    @classmethod
    def car(cls):
        print('类方法')
        return cls(10).test(100)

    def test(self, x):
        print('实例化方法:', self.vehicle_type + x)

print(Vehicle.car())

输出:

类方法
初始化实例属性: 10
实例化方法: 110

代码的执行流程如下:

  1. Vehicle.car():类对象调用类方法。
  2. cls(10):其中cls代指类对象Vehicle,因此cls(10)代表Vehicle(10),相当于对Vehicle类进行了实例化。
  3. __init__:执行类实例化cls(10)时,程序会对实例化属性进行初始化self.vehicle_type = vehicle_type,此时self.vehicle_type=10。
  4. .test(100):实例化对象cls(10)调用实例化方法test(100),此时会执行实例化方法test()中的内容。


案例3:类方法与类方法和类属性之间的调用

class Vehicle:
    x0 = 20

    @classmethod
    def car(cls, x):
        y = cls.test(10) + x
        cls.x0 = cls.x0 + x
        return y, cls.x0

    @classmethod
    def test(cls, x):
        return x

x, y = Vehicle.car(100)
print('调用类方法:',x,y)
print('调用类属性:',Vehicle.x0)

输出: 

调用类方法: 110 120
调用类属性: 120
可以发现,类方法与类方法之间能够相互调用,且类方法可以修改类的属性。

总结

静态方法和类方法都不需实例化,可以直接被调用;

静态方法不接受self作为第一个参数;

类方法接受cls作为第一个参数;

实例化方法接受self作为第一个参数;

静态方法和类方法均不能访问实例属性和调用实例方法;

实例对象可以访问类属性、类方法、实例属性、实例方法。

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

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

相关文章

哈希经典题目(C++)

文章目录 前言一、两数之和1.题目解析2.算法原理3.代码编写 二、判定是否互为字符重排1.题目解析2.算法原理3.代码编写 三、 字⺟异位词分组1.题目解析2.算法原理3.代码编写 总结 前言 哈希表是一个存储数据的容器,我们如果想要快速查找某个元素,就可以…

定个小目标之每天刷LeetCode热题(12)

这是一道简单题,使用位运算中的异或运算即可,异或运算有以下性质: 1、任何数异或 0 结果仍然是原来的数,即 a⊕0a 2、任何数和其自身做异或运算,结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…

对话Nature子刊论文作者:DiG如何揭示蛋白质秘密

编者按:尽管当前利用人工智能技术预测生物分子结构的模型已经可以精确预测包括蛋白质、核酸、小分子、离子和修饰残基在内的复合物结构,但对于科学家们来说仅了解分子的微观结构还远远不够,因为分子的宏观属性和功能往往取决于分子结构在平衡…

游戏盾之应用加速,何为应用加速

在数字化时代,用户对于应用程序的防护要求以及速度和性能要求越来越高。为了满足用户的期望并提高业务效率,应用加速成为了不可忽视的关键。 应用加速是新一代的智能分布式云接入系统,采用创新级SD-WAN跨域技术,针对高防机房痛点进…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…

网易云音乐格式在线转换

应用分享:众所周知网易云下载的格式为 .NCM,只能在网易云音乐里播放。 今天提供在线转换为MP3格式 NCM TO MP3,无需安装,转换后就能在任意播放器使用。 使用地址: https://ncm.worthsee.com/ 网络研究观 数据泄露…

【NOIP普及组】税收与补贴问题

【NOIP普及组】税收与补贴问题 💖The Begin💖点点关注,收藏不迷路💖 每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),…

Win10 Edge提示兼容性问题打不开|解决浏览器兼容性问题

Edge有时候会与某些安全软件不兼容,导致报错 报错代码:STATUS_INVALID_IMAGE_HASH 解决Edge浏览器兼容性问题方法/步骤: 1、按 Win R 组合键,打开运行,并输入 regedit 命令,确定或回车,可以…

Linux Shell脚本编写指南

大家好,在当今快节奏的科技时代,自动化和高效的工作流程对于个人和组织来说变得愈发重要。而Shell脚本编写作为一种强大且广泛应用的技能,成为了实现自动化任务和系统管理的利器。通过编写Shell脚本,我们可以将繁琐的重复任务自动…

JavaScript的核心语法

JavaScript JavaScript:JavaScript的组成:核心语法:Hello:变量:JS的基本数据类型:特殊点: 数组:流程控制语句:函数:函数的重载:函数的递归:预定义…

算法:226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]示例 3&#x…

算法学习笔记(7.4)-贪心算法(区间调度问题)

目录 ##什么是区间调度问题 ##贪心解法 ##具体的例题示例讲解 ##452. 用最少数量的箭引爆气球 - 力扣(LeetCode) ##435. 无重叠区间 - 力扣(LeetCode) ##56. 合并区间 - 力扣(LeetCode) ##什么是区间调…

学习周报:文献阅读+Fluent案例+Fluent相关算法学习

目录 摘要 Abstract 文献阅读:求解正逆运动波问题的物理信息神经网络 文献摘要 讨论|结论 理论基础 KWM(运动波动方程) Hard constraint (硬约束方式) 具有重新分布的搭配点的PINN 具有停止梯度的分数阶方程 …

解决Nginx出现An error occurred问题

每个人遇到Nginx的An error occurred情况可能都不一样(见图1),Nginx造成该错误的原因: 1. 我在配置域名解析成IP时,没有把所有解析配置都修改,见图2:解析 *.hanxiaozhang.xyz 配置的是新IP地…

4.通用编程概念

目录 一、变量与常量1.1 变量1.2 常量 二、遮蔽三、数据类型3.1 标量类型1. 整型2. 浮点型3. 布尔类型4.字符类型 3.2 复合类型1. 元组2. 数组 四、函数五、语句和表达式六、函数的返回值 一、变量与常量 1.1 变量 在Rust中默认的变量是不可变的,如果修改其值会导致…

汽车EDI——Volvo EDI 项目案例

项目背景 作为Volvo的长期合作伙伴,C公司收到Volvo的EDI对接邀请,需要实现EDI对接。C公司将会面临哪些挑战?又应该相应地选择何种EDI解决方案呢? 汽车行业强调供需双方的高效协同(比如研发设计、生产计划、物流信息等…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难:将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40,按照向导将fedora40安装到真机的sda7分区中得到报错如下内容: Failed to find a suitable stage1 device: E…

最大矩形问题

柱状图中最大的矩形 题目 分析 矩形的面积等于宽乘以高,因此只要能确定每个矩形的宽和高,就能计算它的面积。如果直方图中一个矩形从下标为 i 的柱子开始,到下标为 j 的柱子结束,那么这两根柱子之间的矩形(含两端的柱…

论文敲公式敲到“崩溃”?合合信息扫描全能王“公式识别”一键解决公式提取难题

毕业季临近,全国高校毕业生陆续进入了忙碌的“答辩季”。进入“百米冲刺”阶段,论文至关重要。对于理科工学生而言,论文中的数理化公式,稍不注意就容易输错,手动输入误差难以避免。 近日,合合信息旗下扫描…

【C++课程学习】:C++入门(函数重载)

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🌈函数重载: 🍉1.参数个数不同: 🍉2.参数…