staticmethod写和不写有什么区别?

栏目: Python · 发布时间: 7年前

内容简介:系统学python语法是好几年之前的事情了,印象中就是Python的黑魔法真的挺多的,一般你也用不到。今天就来讲一下staticmethod这个装饰器,是我这两天一直想记录下来的一个怪里怪气的东西。网上一般都说类静态方法要@staticmethod,而我实际试验不写也没啥问题的样子:

系统学 python 语法是好几年之前的事情了,印象中就是Python的黑魔法真的挺多的,一般你也用不到。

今天就来讲一下staticmethod这个装饰器,是我这两天一直想记录下来的一个怪里怪气的东西。

网上一般都说类静态方法要@staticmethod,而我实际试验不写也没啥问题的样子:

# -*- coding: utf-8 -*-
 
class haha:
    def x():
        print('x')
 
haha.x()

我们知道在python中一切皆是对象,所以haha类自身也是一个对象,上面的代码和下面等价:

# -*- coding: utf-8 -*-
 
class haha:
    pass
 
def x():
    print('x')
haha.x = x
 
haha.x()

就是往对象上赋值一个属性,保存一个函数。

既然这样就可以实现静态函数了,那还要staticmethod干嘛?看下面的报错就知道了:

# -*- coding: utf-8 -*-
 
class haha:
    def x():
        print('x')
 
 
obj = haha()
obj.x()
 
 
Traceback (most recent call last):
  File "/Users/liangdong/Documents/gitlab/try/main.py", line 9, in <module>
    obj.x()
TypeError: x() takes 0 positional arguments but 1 was given

通过类对象调用静态方法,python会自动加一个self到第一参数,而我们希望x()函数是静态方法,不需要self。

这时候就需要@staticmethod来影响这个行为了:

# -*- coding: utf-8 -*-
 
class haha:
    @staticmethod
    def x():
        print('x')
 
 
obj = haha()
obj.x()
haha.x()

加上@staticmethod的haha类,无论是类还是对象都可以调用到x()方法,终于符合了类静态方法的正常行为表现。


以上所述就是小编给大家介绍的《staticmethod写和不写有什么区别?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

第三次工业革命

第三次工业革命

[美] 杰里米•里夫金(Jeremy Rifkin) / 张体伟 / 中信出版社 / 2012-5 / 45.00元

第一次工业革命使19世纪的世界发生了翻天覆地的变化 第二次工业革命为20世纪的人们开创了新世界 第三次工业革命同样也将在21世纪从根本上改变人们的生活和工作 在这本书中,作者为我们描绘了一个宏伟的蓝图:数亿计的人们将在自己家里、办公室里、工厂里生产出自己的绿色能源,并在“能源互联网”上与大家分享,这就好像现在我们在网上发布、分享消息一样。能源民主化将从根本上重塑人际关系,它将影响......一起来看看 《第三次工业革命》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具