参考:
[1] https://zhuanlan.zhihu.com/p/61042358
[2] Python的 @property装饰器和@setter装饰器和@functools.wraps(func)装饰器
类方法
类方法由类调用,采用 @classmethod 装饰,至少传入一个 cls(代指类本身,类似 self )参数。执行类方法时,自动将调用该方法的类赋值给 cls。建议只使用类名.类方法的调用方式。(虽然也可以使用实例名.类方法的方式调用)
案例1
案例:classmethod的用法举例
class B:
age = 10
def __init__(self,name):
self.name = name
@classmethod
def eat(cls): #普通函数
print(cls.age)
def sleep(self):
print(self)
b = B("小贱人")
b.eat()
#运行结果为:10
案例2
- 实例方法
如果要构造一个类,接受一个网站和这个网站的状态码,然后打印出来。就像这样:
# -*- coding: utf-8 -*-
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’) 这样的,那该怎么做?
首先要把这个拆分,但是要使用实例方法实现起来很麻烦,这个时候就可以使用类方法。
- 类方法
# -*- coding: utf-8 -*-
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) 直接实例化