介绍
知乎论坛,各大博文都已经关于这个问题的介绍炸锅了,介绍的东西太多了,但是基于每个人的层次不同,理解不同,也有好多初学者,一知半解的记录博客,参考这些博客时,有时候会问题百出,因此参考原汁原味的东西才能获取更好更直接的理解。
二话不说
- classmethod是将类本身给传进来,因此在类方法中如果再次调用实例的方法时,通常采用cls().fmethod()
二话不说,举例说明,用一个例子
经典区别案例1
class Date(object):
def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year
@classmethod
def from_string(cls, date_as_string):
day, month, year = map(int, date_as_string.split('-'))
date1 = cls(day, month, year)
return date1
@staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string.split('-'))
return day <= 31 and month <= 12 and year <= 3999
date2 = Date.from_string('11-09-2012')
is_date = Date.is_date_valid('11-09-2012')
print(date2.day)
print(is_date)
运行结果:
11
True
经典实用案例2
class Coordinate:
"""
类:创建坐标系
"""
def point(self,iterable:list):
"""
:param iterable 传入列表
函数会根据列表中的元素组织坐标系
"""
locate = []
for i,v in enumerate(iterable):
locate.append(v)
if i%2 == 1:
yield tuple(locate)
locate.clear()
@classmethod
def outpoint(cls,iterable):
"""
:param iterable是列表
"""
yield from cls().point(iterable)
经典综合案例3
class Datetime(object):
"""
时间类
"""
day = 0
month = 0
year = 0
def __init__(self,year=0,month=0,day=0):
self.day = day
self.month = month
self.year = year
@classmethod
def strtime(cls,strdate):
year,month,day = list(map(int,strdate.rsplit("-")))
#再次通过类方法创建实例
datetime = cls(year,month,day)
return datetime
def printime(self):
print("year:{}".format(self.year))
print("month:{}".format(self.month))
print("date:{}".format(self.day))
Datetime.strtime(stm).printime()
总结
classmethod类方法
- 在类定义中,实用@classmethod装饰器修饰的方法
- 必须至少有一个参数,且第一个参数留给cls,cls指代调用者即类对象本身
- cls这个标识符可以是任意合法名称,但是为了易读,请不要修改
- 通过cls可以直接操作类的属性
staticmethod类方法
- 在类定义中,实用@staticmethod装饰器修饰的方法
- 调用时,不会隐式的传入参数
- 静态方法,只是表明这个方法属于这个名词空间,函数归在一起,方便组织管理