0
点赞
收藏
分享

微信扫一扫

python类方法


参考:

​​史上最全 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) 直接实例化

举报

相关推荐

0 条评论