鱼C论坛

 找回密码
 立即注册
查看: 2588|回复: 3

关于类方法的调用问题

[复制链接]
发表于 2020-10-15 17:32:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 lydygly 于 2020-10-15 17:34 编辑
  1. class A:
  2.     COUNT = 0
  3.     def normal(self):
  4.         print('__normal__')
  5.     @staticmethod
  6.     def smethod():
  7.         print('smethod')
  8.     @classmethod
  9.     def cmethod(cls):
  10.         cls.COUNT += 1
  11.         print(cls.COUNT)

  12. a = A()
  13. b = A()

  14. A.smethod()
  15. a.smethod()

  16. A.normal(A())
  17. A.normal(1)

  18. a.cmethod()
  19. a.cmethod()
复制代码


执行结果:
  1. smethod
  2. smethod
  3. __normal__
  4. __normal__
  5. 1
  6. 2
  7. [Finished in 0.2s]
复制代码



我的疑问:
当用类名直接调用方法时,需要显式传入一个对象作为第一个参数(A.normal(A())) , 但为什么在实例调用类方法时却不需要显式传入一个类给cls呢 ?即,为什么是a.cmethod() 而不是a.cmethod(A) ?

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-15 20:54:54 | 显示全部楼层
这和self不是一样的吗
要么A.normal(a) 要么 a.normal()
实例不需要显示的传self
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-15 21:37:10 | 显示全部楼层
kogawananari 发表于 2020-10-15 20:54
这和self不是一样的吗
要么A.normal(a) 要么 a.normal()
实例不需要显示的传self

不是a.normal,  是 a.cmethod ,  cmethod是一个类方法, 不是普通的方法。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-15 22:14:00 | 显示全部楼层
lydygly 发表于 2020-10-15 21:37
不是a.normal,  是 a.cmethod ,  cmethod是一个类方法, 不是普通的方法。

cls和self不是一样的吗  不这样理解你应该看@classmethod装饰器的源码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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