lydygly 发表于 2020-10-15 17:32:41

关于类方法的调用问题

本帖最后由 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



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

kogawananari 发表于 2020-10-15 20:54:54

这和self不是一样的吗
要么A.normal(a) 要么 a.normal()
实例不需要显示的传self

lydygly 发表于 2020-10-15 21:37:10

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

不是a.normal,是 a.cmethod ,cmethod是一个类方法, 不是普通的方法。

kogawananari 发表于 2020-10-15 22:14:00

lydygly 发表于 2020-10-15 21:37
不是a.normal,是 a.cmethod ,cmethod是一个类方法, 不是普通的方法。

{:10_331:}cls和self不是一样的吗不这样理解你应该看@classmethod装饰器的源码{:10_331:}
页: [1]
查看完整版本: 关于类方法的调用问题