内容简介:系统学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写和不写有什么区别?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ordering Disorder
Khoi Vinh / New Riders Press / 2010-12-03 / USD 29.99
The grid has long been an invaluable tool for creating order out of chaos for designers of all kinds—from city planners to architects to typesetters and graphic artists. In recent years, web designers......一起来看看 《Ordering Disorder》 这本书的介绍吧!