鱼C论坛

 找回密码
 立即注册
查看: 4415|回复: 5

[已解决]Python, 静态方法的优点

[复制链接]
发表于 2021-3-16 14:24:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Peteryo01223 于 2021-3-16 14:32 编辑

静态方法是类的特殊方法,静态方法只需要在普通方法的前边加上 @staticmethod 修饰符即可。
FishC 举例的 code 如下:
  1. class C:
  2.         @staticmethod  # 该修饰符表示 static() 是静态方法
  3.         def static(arg1, arg2, arg3):
  4.                 print(arg1, arg2, arg3, arg1 + arg2 + arg3)

  5.         def nostatic(self):
  6.                 print("I'm the f**king normal method!")
复制代码

静态方法最大的优点是:不会绑定到实例对象上,换而言之就是节省开销。
Code 运行结果如下:
  1. >>> c1 = C()
  2. >>> c2 = C()
  3. # 静态方法只在内存中生成一个,节省开销
  4. >>> c1.static is C.static
  5. True
  6. >>> c1.nostatic is C.nostatic #这里是在测试什么?为何code中定义的 print 内容没有显示?
  7. False
  8. >>> c1.static
  9. <function C.static at 0x03001420>
  10. >>> c2.static
  11. <function C.static at 0x03001420>
  12. >>> C.static
  13. <function C.static at 0x03001420>
  14. # 普通方法每个实例对象都拥有独立的一个,开销较大
  15. >>> c1.nostatic
  16. <bound method C.nostatic of <__main__.C object at 0x03010590>>
  17. >>> c2.nostatic
  18. <bound method C.nostatic of <__main__.C object at 0x032809D0>>
  19. >>> C.nostatic
  20. <function C.nostatic at 0x0328D2B8>
复制代码

问题:
第6句和第7句在测试 nostatic,为什么结果为 false 呢?原 code 中,不是定义了 print 内容么?这里为什么没有被 Python 显示,而被判断为假?
望高人们,帮我扫盲,掰开揉碎,讲解之。
最佳答案
2021-3-16 14:42:41
本帖最后由 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-16 14:42:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 14:51:53 | 显示全部楼层
本帖最后由 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 内存地址并不一致?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 14:53:39 | 显示全部楼层
Peteryo01223 发表于 2021-3-16 14:51
好的。那么,是否表示:
@staticmethod  确保了 def static 的静态方法;
而后面 def nostatic,由于缺 ...

       是的,静态方法绑定的是类,而普通方法绑定的是对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-16 14:54:41 | 显示全部楼层
jackz007 发表于 2021-3-16 14:53
是的,静态方法绑定的是类,而普通方法绑定的是对象。

棒。谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-28 10:50:22 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表