鱼C论坛

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

关于类方法的调用问题

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

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

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

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

a = A()
b = A()

A.smethod()
a.smethod()

A.normal(A())
A.normal(1)

a.cmethod()
a.cmethod()

执行结果:
smethod
smethod
__normal__
__normal__
1
2
[Finished in 0.2s]


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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-15 20:54:54 | 显示全部楼层
这和self不是一样的吗
要么A.normal(a) 要么 a.normal()
实例不需要显示的传self
想知道小甲鱼最近在做啥?请访问 -> 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是一个类方法, 不是普通的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

cls和self不是一样的吗  不这样理解你应该看@classmethod装饰器的源码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 07:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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