参考:
史上最全 Python 面向对象编程 - 知乎
类方法
类方法由类调用,采用@classmethod装饰,至少传入一个cls(代指类本身,类似self)参数。执行类方法时,自动将调用该方法的类赋值给cls。建议只使用类名.类方法的调用方式。(虽然也可以使用实例名.类方法的方式调用)
实际案例
如果要构造一个类,接受一个网站和这个网站的状态码,然后打印出来。就像这样:
class gg:
def __init__(self,url,stat):
self.url=url
self.stat=stat
def outer(self):
print(self.url)
print(self.stat)
if __name__ == '__main__':
a = gg('langzi', 200)
a.outer()
这样就是使用实例方法,虽然可以实现,但是有的时候传入的参数并不是(‘langzi’,200)这样的格式,而是(‘langzi-200’)这样的,那该怎么做?首先要把这个拆分,但是要使用实例方法实现起来很麻烦,这个时候就可以使用类方法。
class gg:
url = 0
stat = 0
# 此处为何要定义变量url和stat
# 原因1:类gg需要2个属性,url与stat
# 原因2: 使用@classmethod, data=cls(url,stat),这个是类的实例化,实例需要属性来接收2个变量
def __init__(self,url=0,stat=0):
self.url=url
self.stat = stat
@classmethod
# 装饰器,立马执行下面的函数
def split(cls,info):
# 这个函数,接收2个参数
# 默认的cls就是这个类的init函数(构造器)
# info 就是外面出来的
url,stat=map(str,info.split("-"))
# 这里转换成类格式化的结构
data=cls(url,stat)
# 这里就直接返回了函数结果,实际上就是经过处理后的实例
return data
def outer(self):
print(self.url)
print(self.stat)
if __name__ == '__main__':
r=gg.split('langzi-200')
a=gg("langzi",200)
a.outer()
r.outer()
经过处理后,两种调用方式
r=gg.split('langzi-200')
a=gg("langzi",200)
我觉得本质区别就是,
gg.split('langzi-200'),一个先经过处理(有一定的逻辑),再实例化,
gg("langzi",200) 直接实例化