当前位置: 首页 > news >正文

python中@classmethod @staticmethod区别

转自:https://www.cnblogs.com/elie/p/5876210.html

Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式.

class A(object): def foo(self, x): print("executing foo(%s,%s)" % (self, x)) print('self:', self)  @classmethod def class_foo(cls, x): print("executing class_foo(%s,%s)" % (cls, x)) print('cls:', cls)  @staticmethod def static_foo(x): print("executing static_foo(%s)" % x) a = A()

1.定义方式

普通的类方法foo()需要通过self参数隐式的传递当前类对象的实例。 @classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。@staticmethod修饰的方法定义与普通函数是一样的。

self和cls的区别不是强制的,只是PEP8中一种编程风格,slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通常用self来传递当前类对象的实例,cls传递当前类对象。

2.绑定对象

foo方法绑定对象A的实例,class_foo方法绑定对象A,static_foo没有参数绑定。
>>> print(a.foo) <bound method A.foo of <__main__.A object at 0x0278B170>> >>> print(a.class_foo) <bound method A.class_foo of <class '__main__.A'>> >>> print(a.static_foo) <function A.static_foo at 0x02780390>

3.调用方式

foo可通过实例a调用,类对像A直接调用会参数错误。

>>> a.foo(1)
executing foo(<__main__.A object at 0x0278B170>,1) self: <__main__.A object at 0x0278B170> >>> A.foo(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() missing 1 required positional argument: 'x'

但foo如下方式可以使用正常,显式的传递实例参数a。

>>> A.foo(a, 1) executing foo(<__main__.A object at 0x0278B170>,1) self: <__main__.A object at 0x0278B170>

class_foo通过类对象或对象实例调用。

>>> A.class_foo(1) executing class_foo(<class '__main__.A'>,1) cls: <class '__main__.A'> >>> a.class_foo(1) executing class_foo(<class '__main__.A'>,1) cls: <class '__main__.A'>

static_foo通过类对象或对象实例调用。

>>> A.static_foo(1) executing static_foo(1) >>> a.static_foo(1) executing static_foo(1)

4.继承与覆盖普通类函数是一样的。

class B(A): pass b = B() b.foo(1) b.class_foo(1) b.static_foo(1) # executing foo(<__main__.B object at 0x007027D0>,1) # self: <__main__.B object at 0x007027D0> # executing class_foo(<class '__main__.B'>,1) # cls: <class '__main__.B'> # executing static_foo(1)

问题:@staticmethod修饰的方法函数与普通的类外函数,为什么不直接使用普通函数?
@staticmethod是把函数嵌入到类中的一种方式,函数就属于类,同时表明函数不需要访问这个类。通过子类的继承覆盖,能更好的组织代码。

参考:What is the difference between @staticmethod and @classmethod in Python?

转载于:https://www.cnblogs.com/fengff/p/8780958.html

相关文章:

  • Unity3d和Android之间互相调用
  • 初涉三分法
  • 关于inodes占用100%解决方法
  • 电商系统处理
  • 20154307《网络对抗》Exp4 恶意代码分析
  • Mac下Nginx访问目录,出现403 Forbidden
  • mac 安装 tomcat 配置
  • 聚类算法
  • 20165215 结对编程——四则运算第一周
  • E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。...
  • 01 JS基础
  • geth常用指令
  • 信号是如何在光纤中传播的?
  • 解析Json字符串的三种方法
  • Python_字符串处理方法
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular 响应式表单之下拉框
  • css系列之关于字体的事
  • Docker: 容器互访的三种方式
  • JavaScript 一些 DOM 的知识点
  • React as a UI Runtime(五、列表)
  • sessionStorage和localStorage
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 每天一个设计模式之命令模式
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 少走弯路,给Java 1~5 年程序员的建议
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 译米田引理
  • 云大使推广中的常见热门问题
  • zabbix3.2监控linux磁盘IO
  • 昨天1024程序员节,我故意写了个死循环~
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #LLM入门|Prompt#3.3_存储_Memory
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #在 README.md 中生成项目目录结构
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)STM32单片机上位机
  • (4)事件处理——(7)简单事件(Simple events)
  • (5)STL算法之复制
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (七)Java对象在Hibernate持久化层的状态
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四)汇编语言——简单程序
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (学习日记)2024.02.29:UCOSIII第二节
  • ***监测系统的构建(chkrootkit )
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .htaccess 强制https 单独排除某个目录