python 成员方法的区别是什么

Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:

1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;

2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;

3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。

实现静态方法和类方法的两种方式

一、在Python 2.3及之前,用staticmethod和classmethod类型对象包装实现

例子如下(注意print里的说明):

class MyClass:
    val1 = 'Value 1'
    def __init__(self):
        self.val2 = 'Value 2'
    def staticmd():
        print '静态方法,无法访问val1和val2'
    smd = staticmethod(staticmd)
    def classmd(cls):
        print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'
    cmd = classmethod(classmd)

执行:

>>> mc = MyClass()
>>> mc.smd()
>>> mc.cmd()
>>> MyClass.smd()
>>> MyClass.cmd()

二、在Python 2.4及之后,用装饰器(decorators)实现

装饰器使用@操作符,例子如下:

class MyClass:
    val1 = 'Value 1'
    def __init__(self):
        self.val2 = 'Value 2'
    @staticmethod
    def staticmd():
        print '静态方法,无法访问val1和val2'
    @classmethod
    def classmd(cls):
        print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'

不管是以上两种方式中的哪一种,执行情况都是一样的,以方式二执行结果为例分析如下:

执行:

>>> mc = MyClass()  # 实例化
>>> mc.staticmd()  # 实例调用静态方法,无法访问实例变量val1和val2
>>>

静态方法,无法访问val1和val2

>>> mc.classmd()  # 实例调用类方法,注意,这里访问的是类MyClass的变量val1的值,不是实例化后mc的实例变量val1,
这里容易混淆,往下看就会明白。val2一直是实例变量,所以无法访问
>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.staticmd()  # 类直接调用静态方法,结果同上面的实例调用,无论是类变量还是实例变量都无法访问
>>>

静态方法,无法访问val1和val2

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用
>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> mc.val1 = 'Value changed'  # 改变实例变量val1的值
>>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值没变,所以,这时的cls.val1是类变量val1,而非实例变量val1
>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用
>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.val1 = 'Class Value changed'  # 改变类变量val1的值
>>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值变了,所以,进一步证明了这时的cls.val1是类变量val1,
而非实例变量val1
>>>

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用
>>>

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

结论

如果上述执行过程太复杂,记住以下两点就好了:

1. 静态成员方法:不能访问类属性,实例属性,相当于一个独立的方法,可以理解和类没关系,只是用类加了个作用域,比如:一个类,有三种加密算法,可以考虑静态方法;

2. 类成员方法:能访问类属性,无法访问实例属性,这里要注意,python是动态语言,和c++不同,实例是可以动态添加属性的,即实例的属性和类的属性不一定一样。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis集群搭建过程遇到的坑

在上一篇博文中搭建好了redis集群,但是仍然存在很多问题 上一篇:k8s下搭建redis集群 1、springboot服务连接 集群配置好了,spring服务应该怎么连接呢?单点和集群的连接配置写法是不一样的 单点 spring:redis:host: ${BTC_RED…

数控加工4轴初探

4轴加工之前一直觉得很神秘,最近画了些时间研究了一下,做过之后发现起始也不是特别复杂。 图中是两步,一步是粗开,已不是用指形铣刀精加工螺旋槽。

Unity Mesh 生成图形(二)

一、概述 Unity 的 Mesh 是用于表示三维物体的网格数据结构。它是由一系列顶点和三角形组成的网格,用于描述物体的形状和外观。 Mesh 是由顶点、三角形和其他相关信息组成的,它用于在 Unity 中创建和渲染三维对象。顶点是网格的基本构建单元&#xff0…

Xen Server 8 Install

Xen Sevrer 前言 XenServer(以前称为 Citrix Hypervisor)是业界领先的平台,实现了经济高效的桌面、服务器和云虚拟化基础结构。XenServer 支持任意规模或类型的组织整合计算资源,以及将计算资源转换为虚拟工作负载,从…

YOLOv7原创独家改进: 小目标 | CAMixing:卷积-注意融合模块和多尺度提取能力 | 2024年4月最新成果

💡💡💡本文独家改进:CAMixingBlock更好的提取全局上下文信息和局部特征,包括两个部分:卷积-注意融合模块和多尺度前馈网络; 💡💡💡红外小目标实现涨点,只有几个像素的小目标识别率提升明显 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特…

Java NIO Selector选择器源码分析

文章目录 前言Selector类结构Selector抽象类AbstractSelectorSelectorImplWindowsSelectorImpl三种SelectionKey集合 前言 Java NIO(New I/O)的Selector选择器是一个用于多路复用(Multiplexing)的I/O操作的关键组件。它允许一个单…

JVM基础篇

初识JVM Java虚拟机的组成 字节码文件 i与1 javap ideajclasslib arthas(线上运行的)

无问芯穹 MaaS AI 平台公测免费试用笔记:二

上一篇笔记中,聊过了无问芯穹的 MaaS 服务中的“虚拟机”产品。本篇文章来聊聊最近宣传中提到的大手笔免费百亿 Token 用量的“大模型服务平台” 吧。 分享下这个支持异构芯片推理的国产 “Replicate”、模型市场服务使用的经验和小技巧。 写在前面 本篇文章根据…

openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint

文章目录 openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint254.1 功能描述254.2 语法格式254.3 参数说明254.4 示例 openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint 254.1 功能描述 指明子链接块的名称。…

HarmonyOS NEXT应用开发之@Provide装饰器和\@Consume装饰器:与后代组件双向同步

Provide和Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,Provide和Consume摆脱参数传递机制的束缚,实现跨层级传递。 其中Provide装饰的变…

JVM入门到精通一篇就够了

JVM入门到精通一篇就够了 一、JVM运行时数据区域1.程序计数器2.虚拟机栈2.1 局部变量表2.2 关于局部变量表的一些思考2.3 操作数栈2.4 动态连接(Dynamic Linking)2.5 返回地址(Return Address) 3. 本地方法栈(Native Stack)4. 虚拟机堆(Heap)4.1 新生代4.2 老年代4.3 新生代对象…

来个自定义的电子木鱼吧

<!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>自定义木鱼</title> </head> <body style"background-…

基于DWT(离散小波变换)的图像加密水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

软件赋能新型工业化,数智培育新质生产力——第二届软件创新发展大会蓄势待发

我国正在加快培育新质生产力&#xff0c;赋能新型工业化&#xff0c;软件作为新质生产力的基石与引擎&#xff0c;发展机遇空前。武汉是中国软件产业的重要一极&#xff0c;以其独特的地理优势和坚实的产业基础&#xff0c;正逐渐成为国内外瞩目的软件产业集聚发展高地。 武汉发…

shell 批量创建用户

代码 rootlocalhost:~ 2024-04-03 15:45:03# cat create_user.sh ######################################################################### # File Name: create_user.sh # Author: eight # Mail: 18847097110163.com # Created Time: Wed 03 Apr 2024 03:…

stm32 HAL中断GPIO——2——代码部分

1HAL中中断结构 在stm32f1XX_it.c中可以看到生成的中断函数 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); 选中函数CtrlF 可调用出搜索框 搜索范围为整个项目 再点击Find Next 检索 可以找到可以找到如下函数 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) {/* EXTI li…

linux 回收站机制(笔记)

Linux下回收站机制https://mp.weixin.qq.com/s/H5Y8VRcaOhFZFXzR8yQ7yg 功能 &#xff1a;设立回收站&#xff0c;并且可定时清空回收站。 一、建议将alias rm 改成别的。 比如alias rmm &#xff0c;同时修改rm -rf ~/.trash/* 改成 rmm -rf ~/.trash/* 不然影响rm 的正常使…

高压放大器高压放大测试器的操作方式讲解

HA-30K 是一台非常实用的高电压讯号放大器&#xff0c;它具有最小的体积、最轻的重量及最简易的操作&#xff0c;非常高的电压输出(30kVp-p)等优点。 本机连续输出电压量最大值达到 30kVp-p&#xff0c;还有输出过压保护&#xff0c;当输出电压≥36kVp-p 时&#xff0c;放大器…

如何在比特币上验证ZK Proofs

1. 引言 前序博客有&#xff1a; 基于BitVM的乐观 BTC bridgeBitVM&#xff1a;Bitcoin的链下合约Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM2&#xff1a;比特币上的无需许可验证以比特币脚本来实现SNARK VerifierClementine&#xff1a;Citrea的基于BitVM的…

kettle介绍-Step之If field value is null

If field value is null介绍 替换NULL值步骤可以将输入流中所有字段的空值进行替换&#xff0c;也可以指定一种类型下的空值进行替换&#xff0c;还可以指定一个字段下的空值进行替换 三种替换NULL模式 所有字段空值全部替换选定字段替换指定值根据数据类型替换指定值