我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

首先要说明的是:python里面的类定义和其它编程语言(比如php)是有很大不同的。用php的思路去解释python的类,就会遇到很大的疑惑,本文也是这样的。本文讲的是:python装饰器@classmethod定义类方法。

苏南大叔:如何使用python装饰器@classmethod定义类方法? - 类方法python
如何使用python装饰器@classmethod定义类方法?(图2-1)

苏南大叔的"程序如此灵动"博客,记录苏南大叔的代码感想感悟。本文的classmethod并不是像staticmethod那样没有约束力。装饰器@classmethod对函数体本身,还是有点实际作用的。

装饰器@classmethod

python类里面的那些第一个参数是self的方法,并不是大家最能接受的“类方法”。classmethod另有其人,是类定义里面第一个参数为cls的方法。

装饰器@classmethod使用例子如下:

class Cat(object):
    def __init__(self,name):
        self.name = name
    def eat2(self,food):
        print(f"{self.name}喜欢吃{food}")
    @classmethod
    def eat(cls,food):
        print(f"{cls}喜欢吃{food}")
        
class Catty(Cat):
    pass
cat_ = Cat("黑猫")

###### 类方法 ######################
Cat.eat("猫粮")          # <class '__main__.Cat'>喜欢吃猫粮
Catty.eat("幼猫粮")      # <class '__main__.Catty'>喜欢吃幼猫粮
cat_.eat("小鱼")         # <class '__main__.Cat'>喜欢吃小鱼
# cat_.eat(Cat,"小小鱼") # TypeError: Cat.eat() takes 2 positional arguments but 3 were given
  
###### 实例方法 ######################
# Cat.eat2("猫粮")       # Cat.eat2() missing 1 required positional argument: 'food'
# Catty.eat2("幼猫粮")   # TypeError: Cat.eat2() missing 1 required positional argument: 'food'
cat_.eat2("小鱼")        # 黑猫喜欢吃小鱼

苏南大叔:如何使用python装饰器@classmethod定义类方法? - classmethod使用对比
如何使用python装饰器@classmethod定义类方法?(图2-2)

例子对比分析

从上面的例子,可以看出:

  • classmethod无论在语法上,还是效果上。都把第一个参数从self变成了类cls
  • 实例也是可以调用classmethod的,第一个参数自动变成cls
  • 类是无法直接调用第一个参数是self的普通实例方法的。
  • classmethod的第一个参数必须隐式传递,无法主动传递。

相关文章

总结

@classmethod显然比@staticmethod,更加具有控制力和效果。更多python相关文章,请点击苏南大叔的博客链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python