python静态方法和类方法

1 python静态方法和类方法

python类方法分为实例方法、类方法、静态方法。

(1) 实例方法,不用修饰,第1个参数为实例对象,默认为self。

通过实例调用时,自动将当前实例传给self;

通过类调用时,需要显式将实例传给self。

(2) 类方法,用@classmethod修饰,第1个参数为类对象,默认为cls。

也可以通过内置函数classmethod(cmeth)将cmeth转为类方法。

通过实例调用时,自动将当前类传递给第1个参数;

通过类调用时,自动将当前类传递给第1个参数。

(3) 静态方法,用@staticmethod修饰,第1个参数不需要默认,无self和cls。

也可以通过内置函数staticmethod(smeth)将smeth转为静态方法。

通过实例调用时,不会自动将当前实例传给第1个参数。

通过类调用时,不需要传送实例给第1个参数。

python2.2版本新增类方法和静态方法,对经典类有效,对新式类无效。

1.1 python类方法

python类方法通过@classmethod修饰,或通过内置函数classmethod()转换。类方法第1个参数为类对象,默认为cls。通过实例调用时,自动将当前类传递给第1个参数,通过类调用时,自动将当前类传递给第1个参数。

类方法适合处理每个类中不同的数据,通过第1个入参cls完成。

1.2 python静态方法

python静态方法通过@staticmethod修饰,或通过内置函数staticmehod()转换。静态方法入参无self和cls。通过实例调用时,不会自动将当前实例传给第1个参数,通过类调用时,不需要显式传递实例给第1个参数。

python静态方法用于处理与类而不是与实例相关的数据。

比如,记录类创建的实例数。

把计数器作为类属性,每次创建实例对象时,构造函数对计数器加1.

类属性是所有实例共享的,可以被所有实例使用。

1.2.1 类内未使用静态方法的无参方法

描述

python2.x和3.x,类的方法未定义第1个入参,通过类和实例调用结果不同。

class NoStaticMed:def printNumOfIns():pass
NO调用方式调用举例python2.xpython3.x
1类调用NoStaticMed.printNumOfIns()报错成功
2实例调用NoStaticMed ().printNumOfIns()报错报错

示例

staticmedcls.py

# coding:utf-8
import sys
print('python版本为:python{}'.format(sys.version.split(' ')[0]))
class NoStaticMed:numOfInstances=0def __init__(self):NoStaticMed.numOfInstances+=1def printNumOfIns():print('创建的实例数为:{}'.format(NoStaticMed.numOfInstances))

python2.x在idle执行结果

>>> import os
>>> os.chdir(r'E:\documents\F盘')
>>> from staticmedcls import NoStaticMed
python版本为:python2.7.18
>>> sm1=NoStaticMed()
>>> sm2=NoStaticMed()
>>> sm3=NoStaticMed()
>>> NoStaticMed.printNumOfIns()
# python 2.x 通过类调用无入参类方法,报 无绑定方法 必须传实例作为第1个入参。
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>NoStaticMed.printNumOfIns()
TypeError: unbound method printNumOfIns() must be called with NoStaticMed instance as first argument (got nothing instead)
>>> sm1.printNumOfIns()
# python 2.x 通过实例调用无入参类方法,报 收到1个入参。即会自动传入一个实例。
Traceback (most recent call last):File "<pyshell#7>", line 1, in <module>sm1.printNumOfIns()
TypeError: printNumOfIns() takes no arguments (1 given)

python3.x在idle执行结果

>>> import os
>>> os.chdir(r'E:\documents\F盘')
>>> from staticmedcls import NoStaticMed
python版本为:python3.7.8
>>> sm1=NoStaticMed()
>>> sm2=NoStaticMed()
>>> sm3=NoStaticMed()
# python 3.x 通过类调用无入参类方法,成功。
>>> NoStaticMed.printNumOfIns()
创建的实例数为:3
>>> sm1.printNumOfIns()
# python 3.x 通过实例调用无入参类方法,报 收到1个入参。即会自动传入一个实例。
Traceback (most recent call last):File "<pyshell#7>", line 1, in <module>sm1.printNumOfIns()
TypeError: printNumOfIns() takes 0 positional arguments but 1 was given

1.2.2 类外无参方法

描述

在类外定义一个函数,用于统计类创建的实例数量。

示例

# coding:utf-8
import sys
print('python版本为:python{}'.format(sys.version.split(' ')[0]))
class OutClassMed:numOfInstances=0def __init__(self):OutClassMed.numOfInstances+=1
def printNumOfIns():print('从 OutClassMed 创建的实例数为:{}'.format(OutClassMed.numOfInstances))

python2.x在idle执行结果

>>> import os;os.chdir(r'E:\documents\F盘')
>>> from staticmedcls import OutClassMed,printNumOfIns
python版本为:python2.7.18
>>> ocm1,ocm2,ocm3=OutClassMed(),OutClassMed(),OutClassMed()
>>> printNumOfIns()
从 OutClassMed 创建的实例数为:3

python3.x在idle执行结果

>>> import os;os.chdir(r'E:\documents\F盘')
>>> from staticmedcls import OutClassMed,printNumOfIns
python版本为:python3.7.8
>>> ocm1=OutClassMed();ocm2=OutClassMed();ocm3=OutClassMed()
>>> printNumOfIns()
从 OutClassMed 创建的实例数为:3

1.2.3 内置函数staticmethod和classmethod

描述

使用内置函数staticmethod()转为静态方法,

使用内置函数classmethod()转为类方法。

示例

Python2.x在idle执行结果

>>> import sys
>>> print('python版本为:python{}'.format(sys.version.split(' ')[0]))
python版本为:python2.7.15
>>> class BuiltInSCMed:def instanceMed(self,x):print(self,x)def staticMed(x):print(x)def clsMed(cls,x):print(cls,x)# 通过内置函数 staticmethod 将 staticMed 转为静态方法staticMed=staticmethod(staticMed)# 通过内置函数 classmethod 将 clsMed 转为类方法staticMed=classmethod(clsMed)
>>> biscm1=BuiltInSCMed()
# 通过实例调用实例方法
>>> biscm1.instanceMed(1)
(<__main__.BuiltInSCMed instance at 0x03B71620>, 1)
# 通过类调用实例方法
>>> BuiltInSCMed.instanceMed(biscm1,2)
(<__main__.BuiltInSCMed instance at 0x03B71620>, 2)
# 通过类调用静态方法
>>> BuiltInSCMed.staticMed(3)
3
# 通过实例调用静态方法
>>> biscm1.staticMed('梯阅线条')
梯阅线条
# 通过类调用类方法
>>> BuiltInSCMed.clsMed('tyxt.work')
(<class __main__.BuiltInSCMed at 0x03CD6650>, 'tyxt.work')
# 通过实例调用类方法
>>> biscm1.clsMed('tyxt.work')
(<class __main__.BuiltInSCMed at 0x03CD6650>, 'tyxt.work')

Python3.x在idle执行结果

>>> import sys
>>> print('python版本为:python{}'.format(sys.version.split(' ')[0]))
python版本为:python3.9.0
>>> class BuiltInSCMed:def instanceMed(self,x):print(self,x)def staticMed(x):print(x)def clsMed(cls,x):print(cls,x)staticMed=staticmethod(staticMed)clsMed=classmethod(clsMed)
>>> biscm1=BuiltInSCMed()
>>> biscm1.instanceMed(1)
<__main__.BuiltInSCMed object at 0x000001B16B6FEBB0> 1
>>> BuiltInSCMed.instanceMed(biscm1,2)
<__main__.BuiltInSCMed object at 0x000001B16B6FEBB0> 2
>>> BuiltInSCMed.staticMed(3)
3
>>> biscm1.staticMed('梯阅线条')
梯阅线条
>>> BuiltInSCMed.clsMed('tyxt.work')
<class '__main__.BuiltInSCMed'> tyxt.work
>>> biscm1.clsMed('tyxt.work')
<class '__main__.BuiltInSCMed'> tyxt.work

1.2.4 内置函数staticmethod转换的静态方法统计实例

python2.x 和3.x 在idle 执行结果 相同

>>> class CountInsBISM:numOfInstances=0def __init__(self):CountInsBISM.numOfInstances+=1def printNumOfIns():print('创建的实例数为:{}'.format(CountInsBISM.numOfInstances))printNumOfIns=staticmethod(printNumOfIns)
>>> cibs1,cibs2,cibs3=CountInsBISM(),CountInsBISM(),CountInsBISM()
>>> CountInsBISM.printNumOfIns()    # 通过类调用
创建的实例数为:3
>>> cibs1.printNumOfIns()   # 通过实例调用
创建的实例数为:3

1.2.5 内置函数classmethod转换的类方法统计实例

python2.x 和3.x 在idle 执行结果 相同

>>> class CountInsBICM:numOfInstances=0def __init__(self):CountInsBICM.numOfInstances+=1def printNumOfIns(cls):print('创建的实例数为:{}'.format(cls.numOfInstances))printNumOfIns=classmethod(printNumOfIns)>>> cibc1,cibc2,cibc3=CountInsBICM(),CountInsBICM(),CountInsBICM()
>>> CountInsBICM.printNumOfIns()    # 通过类调用
创建的实例数为:3
>>> cibc1.printNumOfIns()   # 通过实例调用
创建的实例数为:3

1.2.6 统计每个类的实例

通过类方法统计继承中每个类的实例。

需要在继承中,每个类各自维护一个实例数属性,用于存放各自数据。

示例

>>> class CountInsEC:numOfInstances=0def countcls(cls):cls.numOfInstances+=1def __init__(self):self.countcls()countcls=classmethod(countcls)>>> class SubA(CountInsEC):numOfInstances=0def __init__(self):CountInsEC.__init__(self)>>> class SubB(CountInsEC):numOfInstances=0>>> ciec1,ciec2,ciec3=CountInsEC(),CountInsEC(),CountInsEC()
>>> suba1,suba2=SubA(),SubA()
>>> subb1=SubB()
>>> ciec1.numOfInstances,suba1.numOfInstances,subb1.numOfInstances
(3, 2, 1)
>>> CountInsEC.numOfInstances,SubA.numOfInstances,SubB.numOfInstances
(3, 2, 1)

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

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

相关文章

汽车清除积碳和清洗节气门

汽车清除积碳和清洗节气门 汽车需要清除积碳的部位检查积碳方法&#xff1a; 清除积碳和清洗节气门风险&#xff1a;燃油宝 第一次清除积碳1万公里2万公里3万公里--5万公里6万公里以上 汽车需要清除积碳的部位 节气门喷油嘴进气道燃烧室 检查积碳方法&#xff1a; 建议每3到5…

烦躁的广告弹窗如何在 Edge 上消失?轻松招架 3 种方法

Edge问题解决教程之广告弹窗如何消失&#xff1f; 一、前言&#xff1a;广告弹窗问题二、使用Edge浏览器内置的广告拦截功能三、安装广告拦截浏览器扩展程序四、处理恶意软件和广告弹窗网站五、总结 一、前言&#xff1a;广告弹窗问题 Edge浏览器中出现的广告弹窗问题是由恶意…

Vue3 ts使用wangeditor,提示could not find a declaration file for module解决办法

vue3 typescript中使用wangeditor报如下错误&#xff1a; could not find a declaration file for module wangeditor/editor-for-vue创建env.d.ts declare module wangeditor/editor-for-vue;js库导入vue3 ts中如果出现类似错误都可以用如上方式简单解决。

verilog语法进阶,时钟原语

概述&#xff1a; 内容 1. 时钟缓冲 2. 输入时钟缓冲 3. ODDR2作为输出时钟缓冲 1. 输入时钟缓冲 BUFGP verilog c代码&#xff0c;clk作为触发器的边沿触发&#xff0c;会自动将clk综合成时钟信号。 module primitive1(input clk,input a,output reg y); always (posed…

ES6 面试题 | 02.精选 ES6 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

计算机网络:DNS域名解析系统

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

C++ STL拟容器和容器适配器

容器适配器 除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器&#xff08;adaptor&#xff09;&#xff1a;stack、queue 和 priority_queue。 容器、迭代器和函数都有适配器。 本质上&#xff0c;一个适配是一种机制&#xff0c;能使某种事物的行为看起来像另外一…

DevOps常用工具全家桶,实现高效运维和交付

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

Spring事务失效的几种情况

Spring事务失效的几种情况 1、未被Spring管理的类中的方法 这种情况是指&#xff1a;没有在类上添加Service、Repository、Component等注解将类交由Spring管理&#xff0c;然后该类中还有加上了Transactional注解 例如&#xff1a; Service //如果没有添加Service这个注解…

备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

任务书 软件名称 版本 ubuntu 18.04 64 位 Hadoop&#xff1a;hadoop-3.1.3.tar.gz 3.1.3 Jdk&#xff1a;jdk-8u212-linux-x64.tar.gz 1.8 Spark&#xff1a;spark-3.1.1-bin-hadoop3.2.tgz 3.1.1 Hive&#xff1a;apache-hive-3.1.2-bin.tar.gz 3.1.2 MySQL …

css 多种动画效果

以下是一个示例&#xff0c;演示如何使用 CSS3 创建多个不同的动画效果。这里使用了 keyframes 规则&#xff0c;并通过 CSS 类来应用不同的动画效果&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

商家收款降低费率开户指南:微信支付0.2%费率(千分之二)开通步骤

在数字支付日益普及的今天&#xff0c;降低交易成本对商家而言至关重要。本文将引导您轻松开通微信支付0.2%的超低费率。 首先&#xff0c;让我们深入了解微信支付为不同商户类别提供的相关资质要求、费率标准以及资金结算的时间周期https://kf.qq.com/faq/220228IJb2UV220228u…

JWT知识

JWT概念 JWT组成 Java实现JWT Header String getHeader() {String header "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";String encodeBase64URLSafeString Base64.encodeBase64URLSafeString(header.getBytes(StandardCharset…

8. 安全认证

8. 安全认证 文章目录 8. 安全认证8.1 访问控制概述8.2 认证管理8.3 授权管理8.4 准入控制 8.1 访问控制概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。…

python3.8-3.10各新版本新特性

目录 3.83.8.1 海象运算符(赋值运算符)3.8.2 f-string3.8.3 仅限位置形参 [/],[*]3.8.4 多进程共享内存3.8.5 \__pycache__3.8.6 asyncio3.8.7 dict 3.93.9.1 字典合并运算符3.9.2 字符串对齐方法3.9.3 可选的类型提示3.9.4 更好的浮点数支持3.9.5 更好的异常处理3.9.6 更好的装…

DS|顺序表

问题一&#xff1a;DS顺序表--存储结构与操作 题目描述&#xff1a; 实现顺序表的存储结构和操作 属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09; 操作包括&#xff1a;创建、插入、删除、查找 输入要求&#xff1a; 第1行先输入n表示…

DevEco Studio 项目鸿蒙(HarmonyOS)多语言

DevEco Studio 项目鸿蒙&#xff08;HarmonyOS&#xff09;多语言 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、多语言 新版本IDE可以创建多语言的文件夹&#xff0c;在entry->src->main->resources下&#xff0c;修…

C#深拷贝效率对比

对于浅拷贝和深拷贝&#xff0c;前面的文章已经说明了。 C#浅拷贝和深拷贝数据-CSDN博客 本篇说一下&#xff0c;深拷贝的效率问题&#xff0c;效率一直是程序追求的&#xff0c;效率越高肯定越好&#xff0c;有时候功能是实现了&#xff0c;但是运行以及处理数据的效率非常低…

C/C++ STL提供的关联式容器之set

set&#xff08;集合&#xff09;顾名思义&#xff0c;就是数学上的集合 —— 每个元素最多只出现一次&#xff0c;并且 set 中的元素已经从小到大排好序。 特点 1. 使用红黑树实现&#xff0c;其内部元素依据其值自动排序&#xff0c;每个元素值只能出现一次&#xff0c;…

讯飞星火大模型api调用

讯飞星火大模型&#xff0c;通过websocket方式通信传递协议要求的报文&#xff0c;然后将流式返回的报文拼接为完整的响应内容&#xff0c;status2时是最后一条消息。因为是websocket方式所以是异步响应的&#xff0c;如果想要同步需要使用CountDownLatch控制下线程等待最后一条…