Python, 静态方法的优点
本帖最后由 Peteryo01223 于 2021-3-16 14:32 编辑静态方法是类的特殊方法,静态方法只需要在普通方法的前边加上 @staticmethod 修饰符即可。
FishC 举例的 code 如下:
class C:
@staticmethod# 该修饰符表示 static() 是静态方法
def static(arg1, arg2, arg3):
print(arg1, arg2, arg3, arg1 + arg2 + arg3)
def nostatic(self):
print("I'm the f**king normal method!")
静态方法最大的优点是:不会绑定到实例对象上,换而言之就是节省开销。
Code 运行结果如下:
>>> c1 = C()
>>> c2 = C()
# 静态方法只在内存中生成一个,节省开销
>>> c1.static is C.static
True
>>> c1.nostatic is C.nostatic #这里是在测试什么?为何code中定义的 print 内容没有显示?
False
>>> c1.static
<function C.static at 0x03001420>
>>> c2.static
<function C.static at 0x03001420>
>>> C.static
<function C.static at 0x03001420>
# 普通方法每个实例对象都拥有独立的一个,开销较大
>>> c1.nostatic
<bound method C.nostatic of <__main__.C object at 0x03010590>>
>>> c2.nostatic
<bound method C.nostatic of <__main__.C object at 0x032809D0>>
>>> C.nostatic
<function C.nostatic at 0x0328D2B8>
问题:
第6句和第7句在测试 nostatic,为什么结果为 false 呢?原 code 中,不是定义了 print 内容么?这里为什么没有被 Python 显示,而被判断为假?
望高人们,帮我扫盲,掰开揉碎,讲解之。
本帖最后由 jackz007 于 2021-3-16 14:52 编辑
Python 中的 is 的作用是比较个标识符的内存地址,如果相等,得到 True,否则,得到 False
<function C.static at 0x03001420>
在这条信息中,标识符是 C.static,内存地址是 0x03001420
在本例中,c1 . static、c2 . static、C . static 三个标识符指向同一个内存地址:<function C.static at 0x03001420>。
所以,c1 . static is C . static 得到 True。 本帖最后由 Peteryo01223 于 2021-3-16 14:53 编辑
jackz007 发表于 2021-3-16 14:42
Python 中的 is 的作用是比较个标识符的内存地址,如果相等,得到 True,否则,得到 False
...
好的。那么,是否表示:
@staticmethod确保了 def static 的静态方法;
而后面 def nostatic,由于缺少@staticmethod,导致c1.nostatic 与 C.nostatic 内存地址并不一致? Peteryo01223 发表于 2021-3-16 14:51
好的。那么,是否表示:
@staticmethod确保了 def static 的静态方法;
而后面 def nostatic,由于缺 ...
是的,静态方法绑定的是类,而普通方法绑定的是对象。 jackz007 发表于 2021-3-16 14:53
是的,静态方法绑定的是类,而普通方法绑定的是对象。
棒。谢! 谢谢
页:
[1]