python 类方法、静态方法和实例方法
class Date:
# 构造函数
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def tomorrow(self):
# 实例方法
# 只实现实例方法,暂时忽略处理逻辑
pass
@staticmethod
def parse_from_string(date_str):
# 静态方法不须要传入对象self和类自己cls,因此当须要返回时,须要指定类名称
# 因此就有一个缺点,当类名称改变时,return的类名称就须要跟着修改
# 因此在此基础上有了另外一外解决方式: 类方法
year, month, day = tuple(date_str.split('-'))
return Date(year, month, day)
@staticmethod
def valid_str(date_str):
# 忽略处理逻辑,这里只是为了说明静态方法的用途
year, month, day = tuple(date_str.split('-'))
if int(year) > 0 and (int(month) > 0 and int(month) <= 12) and (int(day) > 0 and int(day) <= 31):
return True
else:
return False
@classmethod
def from_string(cls, date_str):
# 传入一个class, 无论类名称如何改变,都不会受影响
# 因此类方法,弥补了上面所说的静态方法的不足
# 这是否是意味着不须要静态方法了?
# 并非
# 好比: 当只须要验证字符串是否合法时,没有调用到类,这种状况用静态方法,就不会有任何问题。如上面的valid_str方法
year, month, day = tuple(date_str.split('-'))
return cls(year, month, day)
def __str__(self):
return F"{self.year}/{self.month}/{self.day}"
if __name__ == '__main__':
new_day = Date("2018", "12", "31")
# 调用实例方法
new_day.tomorrow()
print(new_day)
# 当类中没有处理 "2018-12-31" 这种参数时,须要在外部处理好后,传入到类中
date_str = "2018-12-31"
year, month, day = tuple(date_str.split("-"))
new_day = Date(int(year), int(month), int(day))
print(new_day)
# 用staticmethod(静态方法)完成初始化
new_day = Date.parse_from_string(date_str)
print(new_day)
# 用classmethod(类方法)完成初始化
new_day = Date.from_string(date_str)
print(new_day)