详解Python中@staticmethod和@classmethod区别及使用示例代码
作者:levi 发布时间:2023-06-03 12:17:20
标签:Python,@staticmethod,@classmethod
本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别。
1、@staticmethod和@classmethod区别
@staticmethod:静态方法
@classmethod:类方法
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用
使用:直接类名.方法名()来调用。@staticmethod和@classmethod都可以直接类名.方法名()来调用,
@staticmethod不需要表示自身对象的self和自身类的cls参数(这两个参数都不需要添加),就跟使用函数一样。
使用:直接类名.属性名或直接类名.方法名。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
使用:直接类名.属性名或直接类名.方法名。
两者定义的装饰器调用方法一样,但是@classmethod装饰器定义的类方法需要传入类参数cls。
@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
而@classmethod有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码更灵活。
2、@staticmethod和@classmethod使用示例代码
class A(object):
def foo(self, x):
print "executing foo(%s, %s)" % (self, x)
@classmethod
def class_foo(cls, x):
print "executing class_foo(%s, %s)" % (cls, x)
@staticmethod
def static_foo(x):
print "executing static_foo(%s)" % x
a = A()
#通过实例调用方法,对象实例a作为第一个参数隐式传递。
a.foo (1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
#对于类方法,对象实例的类将隐式地作为第一个参数而不是传递self
a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
#使用这个类调用class_foo
A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
#对于staticmethods,self(对象实例)和cls(类)都不会作为第一个参数隐式传递。它们的行为类似普通函数,除了你可以从实例或类中调用它们
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
总结一下彼此的调用区别:
来源:https://www.cjavapy.com/article/729/
0
投稿
猜你喜欢
- MySQL使用环境变量TMPDIR的值作为保存临时文件的目录的路径名。如果未设置TMPDIR,MySQL将使用系统的默认值,通常为/tmp、
- 1. @@rowcount: 获取受影响行数 代码如下:update SNS_TopicData set TopicCount=TopicC
- 通过在网络上查找资料和自己的尝试,我认为以下系统参数是比较关键的:(1)、back_log:要求 MySQL 能有的连接数量。当主要MySQ
- 有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,
- 微软今天宣布正式发布SQL Server 2008服务器软件,这将帮助微软与Oracle 11g,IBM DB2 9.5数据库产品对抗.此前
- 把你想加密的文档的源代码拷贝到下面的文本框内,按下生成按钮就可以得到一段加密了的页面代码,把代码复制到新的页面就可以了. [注意:可重复加密
- 背景每次加载数据都要重新Load,想通过加入的注解方式开发缓存机制,每次缓存不用写代码了缺点:目前仅支持一个返回值,虽然能弄成字典,但是已经
- 3月27日,淘宝网获得了由国际权威机构G-CEM颁发的2008年度亚洲区在线客户体验大奖,这是全球互联网企业首次获得此殊荣。如何在让买家更方
- ORA-00600:internal error code,arguments:[num],[?],[?],[?],[?]产生原因:这种错误
- 一个网站的导航就相当于是一条路的路标,不同的是,网站的不同栏目页的入口远远比马路要来得复杂,所以一个清晰的导航设计对于一个网站的意义远远大于
- redux-saga 是一个管理 Redux 应用异步操作的中间件,功能类似redux-thunk + async/await, 它通过创建
- 在CSS布局中,ul,li的运用是非常常见的。配合DIV与CSS,创建无表格布局。 其实Dreamweaver中也有自带的CSS布局的范例,
- 先思考一些问题:它是做什么的、以及怎么使用它。带着这些问题往下走。consul是做什么的consul用于微服务下的服务治理。服务治理是什么?
- 刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数?你看完这篇
- 给静态网页加密的方法有很多,有的简单有的复杂。前两天看见有人问静态网页加密问题,就写了这个代码思路:加密时:先把用户的密钥A用md5加密为B
- zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下:class zipfile
- 1.基本结构 create OR REPLACE PROCEDURE存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBE
- .xls格式 Office2003及以下版本 .xlsx格式Offi
- '************************************* '读取文件 &
- 在document.form1.submit();后加document.body.innerHtml = "W