如何使用python装饰器@classmethod定义类方法?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
首先要说明的是:python
里面的类定义和其它编程语言(比如php
)是有很大不同的。用php
的思路去解释python
的类,就会遇到很大的疑惑,本文也是这样的。本文讲的是:python
装饰器@classmethod
定义类方法。
苏南大叔的"程序如此灵动"博客,记录苏南大叔的代码感想感悟。本文的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("小鱼") # 黑猫喜欢吃小鱼
例子对比分析
从上面的例子,可以看出:
classmethod
无论在语法上,还是效果上。都把第一个参数从self
变成了类cls
。- 实例也是可以调用
classmethod
的,第一个参数自动变成cls
。 - 类是无法直接调用第一个参数是
self
的普通实例方法的。 classmethod
的第一个参数必须隐式传递,无法主动传递。
相关文章
总结
@classmethod
显然比@staticmethod
,更加具有控制力和效果。更多python
相关文章,请点击苏南大叔的博客链接:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。