【Python】普通方法、类方法和静态方法的区分

Python 中普通方法、类方法和静态方法的区分

下面我将从多个维度对这三种方法进行详细对比,并通过示例说明它们的使用场景和区别。

1. 核心区别总结

特性普通方法(实例方法)类方法(@classmethod)静态方法(@staticmethod)
定义装饰器@classmethod@staticmethod
第一个参数self (实例对象)cls (类对象)无特殊参数
访问权限可访问实例和类属性只能访问类属性不能访问类或实例属性
调用方式必须通过实例调用可通过类或实例调用可通过类或实例调用
主要用途操作实例数据类级别操作/工厂方法工具函数/辅助功能

2. 详细解析

普通方法 (实例方法)

  • 定义:不添加任何装饰器的方法
  • 特点
    • 第一个参数必须是 self,代表实例对象
    • 可以自由访问实例属性和类属性
    • 必须通过实例调用
class MyClass:class_attr = "类属性"def __init__(self, value):self.instance_attr = valuedef normal_method(self):print(f"实例属性: {self.instance_attr}")print(f"访问类属性: {self.class_attr}")print(f"self的类型: {type(self)}")obj = MyClass("实例值")
obj.normal_method()

类方法 (@classmethod)

  • 定义:使用 @classmethod 装饰器
  • 特点
    • 第一个参数必须是 cls,代表类对象
    • 只能访问类属性,不能访问实例属性
    • 可通过类或实例调用
    • 常用于创建工厂方法或替代构造函数
class MyClass:class_attr = "类属性"@classmethoddef class_method(cls):print(f"访问类属性: {cls.class_attr}")print(f"cls的类型: {type(cls)}")# print(cls.instance_attr)  # 报错,无法访问实例属性MyClass.class_method()  # 通过类调用
obj = MyClass()
obj.class_method()      # 通过实例调用

静态方法 (@staticmethod)

  • 定义:使用 @staticmethod 装饰器
  • 特点
    • 没有特殊的第一个参数
    • 不能访问类属性或实例属性
    • 本质上只是放在类命名空间中的普通函数
    • 可通过类或实例调用
class MyClass:class_attr = "类属性"@staticmethoddef static_method(x, y):print(f"计算结果: {x + y}")# print(class_attr)  # 报错,无法访问类属性# print(self.instance_attr)  # 报错,无法访问实例属性MyClass.static_method(3, 5)  # 通过类调用
obj = MyClass()
obj.static_method(1, 2)      # 通过实例调用

3. 综合示例

class Pizza:base_price = 15  # 类属性def __init__(self, ingredients):self.ingredients = ingredients  # 实例属性# 普通方法 - 操作实例数据def calculate_price(self):return self.base_price + len(self.ingredients) * 2# 类方法 - 工厂方法@classmethoddef margherita(cls):return cls(["mozzarella", "tomatoes"])# 类方法 - 修改类状态@classmethoddef set_base_price(cls, new_price):cls.base_price = new_price# 静态方法 - 工具函数@staticmethoddef get_pizza_info():return "Pizza是意大利传统美食"# 使用示例
p1 = Pizza.margherita()  # 使用类方法创建实例
print(p1.calculate_price())  # 17 (15 + 2*1)Pizza.set_base_price(20)  # 修改类属性
print(Pizza.base_price)   # 20print(Pizza.get_pizza_info())  # 调用静态方法

4. 内存布局示意图

类对象 (Pizza)
├── 类属性 (base_price)
├── 类方法 (margherita, set_base_price)
├── 静态方法 (get_pizza_info)
└── 实例方法 (calculate_price)└── 通过self访问实例数据

5. 使用场景建议

  1. 使用普通方法

    • 需要访问或修改实例状态时
    • 方法逻辑与特定实例相关时
  2. 使用类方法

    • 需要创建类的不同变体(工厂模式)
    • 需要操作类级别状态(如修改类变量)
    • 在继承中需要多态行为时
  3. 使用静态方法

    • 方法逻辑与类相关但不依赖类或实例状态
    • 作为工具函数或辅助方法
    • 希望将相关功能组织在一起时

记住:当方法不需要访问任何类或实例属性时,考虑使用静态方法;当只需要访问类属性时,使用类方法;当需要访问实例属性时,必须使用普通方法。

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

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

相关文章

geoserver发布arcgis瓦片地图服务(最新版本)

第一步:下载geoserver服务,进入bin目录启动 需要提前安装好JDK环境,1.8及以上版本 安装完成,页面访问端口,进入控制台界面,默认用户名密码admin/geoserver 第二步:下载地图 破解版全能电子地图下载器&…

Linux服务之lvs集群与dr模式部署

目录 一.lvs相关概述 1.lvs集群的工作模式 2.lvs调度算法 3.ipvsadm工具 二.DR模式部署 一.lvs相关概述 1.lvs集群的工作模式 lvs-nat:修改请求报文的目标IP,多目标IP的DNAT lvs-dr:操纵封装新的MAC地址(直接路由)lvs-tu…

OFCMS代码审计-freemaker注入sql注入xxexss文件上传

环境搭建 下载地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入&#xff08;freemaker) FreeMarker模板注入实现远程命令执行 - Eleven_Liu - 博客园 在admin中找到这个 发现请求的是这个 找到他 <#assign value"f…

一键部署NSFW检测模型:快速识别并过滤敏感图片内容

以下是对nsfw_detector的简单介绍&#xff1a; nsfw_detector是一个 NSFW 内容检测器&#xff0c;支持快速docker私有部署&#xff0c;提供API服务低资源消耗&#xff0c;2GB内存即可运行该模型&#xff0c;多核CPU自动调度加速推理 - 可以识别多种文件类型&#xff1a;图片、…

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;导致请求直接穿透缓存到达数据库&#xff0c;给数据库带来压力的情况。 常见的解决方案有两种&#xff1a; 缓存空对象&#xff1a;实现简单&#xff0c;维护方便&am…

【C】初阶数据结构15 -- 计数排序与稳定性分析

本文主要讲解七大排序算法之外的另一种排序算法 -- 计数排序 目录 1 计数排序 1&#xff09; 算法思想 2&#xff09; 代码 3&#xff09; 时间复杂度与空间复杂度分析 &#xff08;1&#xff09; 时间复杂度 &#xff08;2&#xff09; 空间复杂度 4&#xff09; 计…

mysql的一个缺点

最近再移植一个从oracle转mysql的项目&#xff0c;喜提一个报错&#xff1a; You cant specify target table A016 for update in FROM clause 对应的程序代码&#xff1a; public void setCurrent(String setId, String pk, String userId) throws SysException {String[]…

Ubuntu 上安装 FTP 服务、开放指定端口并创建用户

一、安装 FTP 服务&#xff08;vsftpd&#xff09; sudo apt update sudo apt install vsftpd -y二、修改 vsftpd 配置&#xff0c;使用 21000 端口 编辑配置文件&#xff1a; sudo nano /etc/vsftpd.conf修改或添加以下配置&#xff1a; 使用以下配置文件需要修改的地方:l…

用自写的jQuery库+Ajax实现了省市联动

1. 省市联动&#xff1a;在网页上&#xff0c;选择对应的省份之后&#xff0c;动态的关联出该省份对应的市。选择对应的市之后&#xff0c;动态地关联出城市对应的区。 2. 设计数据库表 t_area &#xff08;区域表&#xff09; id(PK-自增) code name pcode ------------…

【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓

文章目录 &#x1f504; 迭代器模式&#xff08;Iterator Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;背包系统遍历&#xff09;1. 定义迭代器与聚合接口2. 实现具体聚合类&#xff08;背包物品集合&#xff09;3. 实现具…

18前端项目----Vue项目收尾优化|重要知识

收尾/知识点汇总 项目收尾二级路由未登录全局路由守卫路由独享守卫图片懒加载路由懒加载打包上线 重要知识点汇总组件通信方式1. props2. 自定义事件3. 全局事件总线4. 订阅与发布pubsub5. Vuex6. 插槽 sync修饰符attrs和listeners属性children和parent属性mixin混入作用域插槽…

【Linux】基础指令(Ⅱ)

目录 1. mv指令 2. cat指令 3.echo指令 补&#xff1a;输出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 时间戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 语法&#xff1a;mv [选项]... 源文件/目录 目标文件/目录 …

docker及docker-compose安装及使用

docker compose &#x1f517;官网地址 一、为什么要使用docker compose 1. 简化管理 • 通过一个 YAML 文件定义和管理多容器应用。 • 简化服务间的编排与协调&#xff0c;方便环境的管理与复制。 2. 提升协作效率 • 配置文件易于共享&#xff0c;便于开发、运维等团队协…

JVM学习专题(二)内存模型深度剖析

目录 1.JVM结构体系 ​编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧&#xff1a; 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器&#xff1a; 3.方法区 ​4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…

Flink之Table API

Apache Flink 的 Table API 是 Flink 提供的一种高级抽象&#xff0c;用于以声明式方式处理批处理和流处理数据。它是基于关系模型的 API&#xff0c;用户可以像编写 SQL 一样&#xff0c;以简洁、类型安全的方式编写数据处理逻辑。 一、基本概念 1. 什么是 Table API&#xf…

基于Vue3.0的高德地图api教程005:实现绘制线并编辑功能

文章目录 6、绘制多段线6.1 绘制多段线6.1.1 开启绘制功能6.1.2 双击完成绘制6.1.3 保存到数据库6.2 修改多段线6.2.1 点击线,进入编辑模式6.2.2 编辑线6.3 完整代码6、绘制多段线 6.1 绘制多段线 6.1.1 开启绘制功能 实现代码: const changeSwitchDrawPolyline = ()=>…

“redis 目标计算机积极拒绝,无法连接” 解决方法,每次开机启动redis

如果遇到以上问题 先打开“服务” 找到App Readiness 右击-启动 以管理员身份运行cmd&#xff0c;跳转到 安装redis的目录 运行&#xff1a;redis-server.exe redis.windows.conf 以管理员身份打开另一cmd窗口&#xff0c;跳转到安装redis的目录 运行&#xff1a;redis-…

Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新

面对城市停车资源错配导致的30%以上交通拥堵问题&#xff0c;本文以某新一线城市智慧交通项目为蓝本&#xff0c;深度解析Java大数据技术如何实现多源停车数据融合、动态路径规划与诱导策略优化。通过构建“感知-计算-决策”全链路系统&#xff0c;实现车位状态更新延迟<200…

牛客周赛 Round 92(再现京津冀蓝桥杯???)

1. 小红的签到题 现在小红希望你写出一个长度为 nnn 的、使用了下划线命名法命名的变量。为了显出特征&#xff0c;请保证该变量至少由两个单词组成。 输入描述: 输入一个正整数 n(3≦n≦100)&#xff0c;代表需要构造的变量长度。 输出描述: 输出一个长度为 n 的字符串&#x…

2025-05-11 Unity 网络基础11——UnityWebRequest

文章目录 1 UnityWebRequest 介绍2 搭建 HTTP 服务器3 常用操作3.1下载资源3.1.1 下载文本3.1.2 下载图片3.1.3 下载 AB 包 3.2 上传资源3.2.1 上传数据类3.2.2 POST 上传3.3.3 PUT 上传 4 自定义操作4.1 下载资源4.1.1 Unity 内置 Handler4.1.2 自定义 Handler 4.2 上传资源4.…