Python静态方法和类方法的区别和应用(无师自通)

2023-11-11

实际上,Python 完全支持定义类方法,甚至支持定义静态方法。Python 的类方法和静态方法很相似,它们都推荐使用类来调用(其实也可使用对象来调用)。

 

类方法和静态方法的区别在于,Python会自动绑定类方法的第一个参数,类方法的第一个参数(通常建议参数名为 cls)会自动绑定到类本身;但对于静态方法则不会自动绑定。

使用 @classmethod 修饰的方法就是类方法;使用 @staticmethod 修饰的方法就是静态方法。

下面代码示范了定义类方法和静态方法:

  class Bird:      # classmethod修饰的方法是类方法      @classmethod      def fly (cls):          print('类方法fly: ', cls)      # staticmethod修饰的方法是静态方法      @staticmethod      def info (p):          print('静态方法info: ', p)  # 调用类方法,Bird类会自动绑定到第一个参数  Bird.fly()  #①  # 调用静态方法,不会自动绑定,因此程序必须手动绑定第一个参数  Bird.info('crazyit')  # 创建Bird对象  b = Bird()  # 使用对象调用fly()类方法,其实依然还是使用类调用,  # 因此第一个参数依然被自动绑定到Bird类  b.fly()  #②  # 使用对象调用info()静态方法,其实依然还是使用类调用,  # 因此程序必须为第一个参数执行绑定  b.info('fkit')

从上面粗体字代码可以看出,使用 @classmethod 修饰的方法是类方法,该类方法定义了一个 cls 参数,该参数会被自动绑定到 Bird 类本身,不管程序是使用类还是对象调用该方法,Python 始终都会将类方法的第一个参数绑定到类本身,如 ① 号、② 号代码的执行效果。

上面程序还使用 @staticmethod 定义了一个静态方法,程序同样既可使用类调用静态方法,也可使用对象调用静态方法,不管用哪种方式调用,Python 都不会为静态方法执行自动绑定。

在使用 Python 编程时,一般不需要使用类方法或静态方法,程序完全可以使用函数来代替类方法或静态方法。但是在特殊的场景(比如使用工厂模式)下,类方法或静态方法也是不错的选择。

推荐学习路线Python静态方法和类方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python静态方法和类方法的区别和应用(无师自通) 的相关文章

  • 如何访问pandas数据框中的多级索引?

    我想用相同的索引来调用这些行 这是示例数据框 arrays np array bar bar baz baz foo foo qux qux np array one two one two one two one two df pd Da
  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • Python 中 genfromtxt() 的可变列数?

    我有一个 txt具有不同长度的行的文件 每一行都是代表一条轨迹的一系列点 由于每条轨迹都有自己的长度 因此各行的长度都不同 也就是说 列数从一行到另一行不同 据我所知 genfromtxt Python 中的模块要求列数相同 gt gt g
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • 在 python-docx 中搜索和替换

    我有一个包含以下字符串的文档 模板 你好 我的名字是鲍勃 鲍勃是一个很好的名字 我想使用 python docx 打开此文档并使用 查找和替换 方法 如果存在 来更改每个字符串 Bob gt Mark 最后 我想生成一个新文档 其中包含字符
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • 如何使用 openpyxl 对工作簿中的 Excel 工作表/选项卡进行排序

    我需要按字母数字对工作簿中的选项卡 工作表进行排序 我在用openpyxl https openpyxl readthedocs io en default 操作工作表 您可以尝试排序workbook sheets list workboo
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 行为:如何从另一个文件导入步骤?

    我刚刚开始使用behave http pythonhosted org behave 一个Pythonic BDD框架 使用小黄瓜语法 http docs behat org guides 1 gherkin html 行为需要一个特征 例
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • Python 矩阵每一行的总和

    lista 1 2 3 4 5 6 7 8 9 print lista def filas lista res for elemento in lista x sum lista elemento res append x print re
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA

随机推荐

  • Python基于OpenCV库Adaboost实现人脸识别功能详

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能 分享给大家供大家参考 具体如下 以前用Matlab写神经网络的面部眼镜识别算法 研究算法逻辑 采集大量训练数据 迭代 计算各感知器的系数 相当之麻烦 而现在运用调
  • STDOUT/STDERR重定向到ALOG中

    说下背景 现在众多Android开发者新添加的Google暂时并不会支持的功能 比如拨号上网 USB打印机等等 一般的实现方法就是静态编译Linux的相对开源库和程序 一般是C C 语言 然后由Apk一层一层调用 最终是调用这个命令来实现的
  • mpeg4 码流格式及判断关键帧

    MPEG4码流视频关键帧头部16个字节 非关键帧8个字节 均包含四字节ID 说明如下 关键帧 字节 0 1 2 3 4 5 6 7 8 9 A B C D E F 值 0 0 1 FB XX R W H Date time Length 含
  • Java 序列化与反序列化(Serialization)

    一 什么是 为什么需要 序列化 Serialization 是将对象的状态信息转化为可以存储或者传输的形式的过程 反序列化则为其逆过程 内存的易失性 传输需要 一些应用场景中需要将对象持久化下来 以便在需要的时候进行读取 二 JDK提供的A
  • 前端 面经/编码规范/教程/安装总结

    文章目录 面经 编码规范 学习教程 安装 配置环境 遇到过的问题 实习之后发现了很多东西 所以最近就梳理了一些前端可能用到的教程等等 链接已经放在下面了 同样也是为了方便自己查阅 面经 震惊 前端300基础面试题 答案 分类学习整理 良心制
  • 将项目 上传到Git上面

    使用git bash命令上传 1 通过命令行创建一个新的版本库 touch README md git init git add REAIME md git commit m first commit git remote add orig
  • Pow(x, n)

    Pow x n 思路 x n x x n 2 当n为偶数 x n x x n 2 x 当n为奇数 当n为负数时 x n 1 x n 注意 对边界条件的处理 当n INT MIN时 直接取负会溢出 https discuss leetcode
  • Mybatis-plus使用注解 @TableField(exist = false) 注明非数据库字段属性

    TableField exist false 注解加载bean属性上 表示当前属性不是数据库的字段 但在项目中必须使用 这样在新增等使用bean的时候 mybatis plus就会忽略这个 不会报错
  • 批量删除.svn文件夹、.svn文件

    http www phpvar com archives 311 html 使用svn进行版本控制 每个文件夹下都有 svn文件夹 有些项目在脱离svn版本控制之后 想删除项目中所有的 svn文件夹 可用下面的方法进行快速删除 1 打开要删
  • Vue基础精讲 —— 实例解析Vue的生命周期

    结合官网Vue生命周期图例 实例生命周期钩子 vue生命周期 import Vue from vue new Vue el root template div text div data text text beforeCreate 无法做
  • C语言计算机二级/C语言期末考试 刷题(四)

    收集了一些经典C语言计算机二级和C语言期末考试题库 整理不易 大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 系列文章 C语言计算机二级 C语言期末考试 刷题 一 C语言计算机二级 C语言期末考试 刷题 二 C语言计算机二级 C语
  • dedecms织梦系统基本参数添加内容后首页显示后台空白不显示

    最近跟版网的小编在测试织梦模板时候发现 添加首页名称 版权信息 备案号等 保存后首页能显示 但是后台却没有文字 更新缓存也没用 那么这种情况该如何解决呢 小编告诉您 找到 dede templets sys info htm这个文件 里边找
  • syslog协议介绍

    syslog协议介绍 syslog架构 Unix Linux系统中的大部分日志都是通过一种叫做syslog的机制产生和维护的 syslog是一种标准的协议 分为客户端和服务器端 客户端是产生日志消息的一方 而服务器端负责接收客户端发送来的日
  • python unicodedecodeerror utf8_python问题,我运用python做中文词频分析的时候总是显示UnicodeDecodeError: 'utf-8'问题?...

    以下是我在python3 7idle中写的的语句importjiebatxt open E study pythondata 应用资料 三国演义 txt r encoding utf 8 read words jieba lcut txt
  • “Dependency ‘com.mysql:mysql-connector-j:‘ not found “等无法找到依赖问题解决

    在创建新的springboot项目时如果碰到 说明在该新建的项目中没有导入下列依赖 本人解决步骤 1 新建一个Maven工程 2 在该工程中加入自己想创建的springboot模块 3 将爆红的依赖复制粘贴进Maven项目中的pom xml
  • Mybatis查询where条件报 java.lang.IllegalStateException: range unbounded on this side解决方案

    Mybatis查询where条件报 java lang IllegalStateException range unbounded on this side解决方案 问题背景 解决方案 Lyric 就算是我不懂 问题背景 在使用id进行条件
  • docker-compose的使用

    一 docker compose命令 docker compose的使用非常类似于docker命令的使用 但是需要注意的是大部分的compose命令都需要到docker compose yml文件所在的目录下才能执行 docker comp
  • 数学建模笔记(三):数据预处理

    文章目录 前言 一 数据清洗 1 1 缺失值处理 1 2 异常值处理 二 数据变换 2 1 线性变换 2 2 向量规范化 2 3 min max归一化 2 4 z score标准化 三 数据预处理案例及代码实现 3 1 线性变换 代码实现
  • 【算法】算法学习四:图

    文章目录 一 什么是图 二 广度优先搜索 三 什么是队列 四 广度优先搜索的实现 4 1 实现全部的代码 4 2 队列的实现 五 深度优先搜索 六 图的运行时间 6 1 广度优先搜索 6 2 深度优先搜索 一 什么是图 在计算机科学中 图
  • Python静态方法和类方法的区别和应用(无师自通)

    实际上 Python 完全支持定义类方法 甚至支持定义静态方法 Python 的类方法和静态方法很相似 它们都推荐使用类来调用 其实也可使用对象来调用 类方法和静态方法的区别在于 Python会自动绑定类方法的第一个参数 类方法的第一个参数