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'@staticmethoddef staticmd():print '静态方法,无法访问val1和val2'@classmethoddef 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++不同,实例是可以动态添加属性的,即实例的属性和类的属性不一定一样。

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

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

相关文章

无法解析的外部符号,在xxxx中调用

这个函数在类里****没有正确定义: 1.头文件只有声明,没有实现 2.只有实现,没有声明 3.声明的和实现的,参数不对

SEO文章写作器,批量写作原创SEO收录文章

在当今数字化时代,搜索引擎优化(SEO)已经成为了网站获得流量和曝光度的关键手段之一。而在SEO领域中,内容的质量和原创性是至关重要的。为了应对不断增长的内容需求,越来越多的人开始转向AI写作生成器,这些…

Nginx在Kubernetes集群中的进阶应用

简介 在现代DevOps环境中,Nginx作为负载均衡器与Kubernetes的Ingress资源的结合,为应用程序提供了强大的路由和安全解决方案。本文将深入探讨如何利用Nginx的灵活性和功能,实现高效、安全的外部访问控制,以及如何配置Ingress以优…

MySQL 优化及故障排查

目录 一、mysql 前置知识点 二、MySQL 单实例常见故障 故障一 故障二 故障三 故障四 故障五 故障六 故障七 故障八 三、MySQL 主从故障排查 故障一 故障二 故障三 四、MySQL 优化 1.硬件方面 (1)关于 CPU (2)关…

基于Springboot+Vue前后端分离的(学生信息)课程管理系统设计与实现+论文+PPT+指导搭建视频

介绍 系统设计是一个把软件需求转换成用软件系统表示的过程通过对目标系统的分析和研究,做出了学生信息管理系统的总体规划,这是全面开发系统的重要基础。在对学生信息管理系统全面分析调查的基础上,制定出学生信息管理系统的总体规划。系统…

jupyter加目录contrib nbextension 使用

jupyter在工作中使用很方便,可是一旦单个文件的内容多了,即使有markdown文本提醒,上下翻找依旧很费精力。这时,有个目录就显得至关重要了。 1 安装模块 打开anaconda的PowerShell(带有Prompt的)&#xff0…

lanbiew程序如何提高变量读取速度(全是干货)

闲来无事做了个测试,使用四种不同的方式生成一个10万个数的数组: 1.用局部变量生成一个十万个数的数组 2.用全局变量生成一个十万个数的数组 3.用应用程序目录生成一个十万个路径的数组 4.用属性节点的方式生成十万个数的数组 结果是:应用程…

Gmail多账号防封攻略,看这一篇就够了

您的业务活动需要多个 Gmail 帐户吗?出海畅游,Gmail账号是少不了的工具之一,可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台,可以说是海外网络的“万能锁”。但是大家都知道,以上这些平台注册多账号如果产生关…

Java | Leetcode Java题解之第4题寻找两个正序数组的中位数

题目&#xff1a; 题解&#xff1a; class Solution {public double findMedianSortedArrays(int[] A, int[] B) {int m A.length;int n B.length;if (m > n) { return findMedianSortedArrays(B,A); // 保证 m < n}int iMin 0, iMax m;while (iMin < iMax) {int…

GitOps - 为 OpenShift GitOps 配置邮件通知

《OpenShift 4.x HOL教程汇总》 说明&#xff1a;本文已经 在OpenShift 4.15 文章目录 ArgoCD 的 Notification 功能简介启动 OpenShift GitOps 的 Notification 功能配置邮件通知验证参考 说明&#xff1a;先根据《OpenShift 4 之 GitOps&#xff08;1&#xff09;通过OpenSh…

1363:小球(drop)

【算法分析】 【参考代码】 解法1&#xff1a;链式存储结构二叉树 #include <bits/stdc.h> using namespace std; #define N 1100000 struct Node {int n, left, right;//n:编号 left, right&#xff1a;左后孩子的地址bool v;//布尔值 }; Node node[N];//结点池 int…

分享一种快速移植OpenHarmony Linux内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者&#xff0c;介绍一种借助三方芯片平台自带 Linux 内核的现有能力&#xff0c;快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…