一、引言 在学习python面向对象的路上,有很多抽象名词,如果理解不透彻很容易张冠李戴,本篇主要围绕面向对象的实例方法、静态方法以及类方法展开。 二、正文 在正式开始前,先
一、引言
在学习python面向对象的路上,有很多抽象名词,如果理解不透彻很容易张冠李戴,本篇主要围绕面向对象的实例方法、静态方法以及类方法展开。
二、正文
在正式开始前,先构造一个关于日期的类,对于实例方法、静态方法和类方法都已经做了标注。(此处代码格式缩进存在问题,如需源码请前往文末链接)
class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day # 实例方法 def tomorrow(self): self.day += 1 # 静态方法 -- 判断一个日期是否有效 @ staticmethod def valid_date(date_str): year, month, day = tuple(date_str.split("-")) conditions = [ int(year) > 0, 0 < int(month) <= 12, 0 < int(day) <= 31, # 此处为简化问题不做讨论 ] if all(conditions): return True else: return False # 类方法 -- 格式化日期 @classmethod def parse_string(cls, date_str): year, month, day = tuple(date_str.split("-")) return cls(int(year), int(month), int(day))1. 实例方法
实例方法其实比较好理解,首先,方法其实就是函数,也就是说实例方法是实例对象所拥有的函数功能。什么?不知道实例对象是什么?(如果对于面向对象这个问题都不太了解的可以点击此处)
你可以把类想象成设计图纸,工程师可以拿着这张图纸去建造各种摩天大楼,所建造出来的摩天大楼其实就是实例对象。
此处的实例方法的作用就是日期+1
def tomorrow(self): self.day += 12. 静态方法
想象这样一个场景,有很多类似于“2018-8-29”这样格式的日期,想要通过这一个类来使用,如果在实例后每次都要手工再加上一段这样的代码:
date_str = "2018-8-29" y, m, d = tuple(date_str.split("-")) date = Date(int(y), int(m), int(d))是不是觉得非常麻烦?其实对于这种情况,我们往往会把这一步骤通过静态方法来完成。
# 静态方法 -- 格式化日期 @staticmethod def parse_from_string(date_str): year, month, day = tuple(date_str.split("/")) return Date(int(year), int(month), int(day))这样就方便了很多,但还存在一个问题,就是返回值中的Date在类名修改后这里也要随之修改,就会有些麻烦,怎么解决呢?
答案是:类方法。
如果类方法可以解决这个问题的话,那静态方法还有那些用途呢?
答案是:用于判断一些固有的属性
比如判断一个日期格式是否有效时就会使用静态方法
# 静态方法 -- 判断一个日期是否有效 @ staticmethod def valid_date(date_str): year, month, day = tuple(date_str.split("-")) conditions = [ int(year) > 0, 0 < int(month) <= 12, 0 < int(day) <= 31, # 此处为简化问题不做讨论 ] if all(conditions): return True else: return False注意静态方法的写法和普通函数的写法是一样的,只是存在于类当中,并且前面加了一个装饰器@staticmethod
3. 类方法
前面提过类方法的好处,就是忽略掉修改类名带来的影响
# 类方法 -- 格式化日期 @classmethod def parse_string(cls, date_str): year, month, day = tuple(date_str.split("-")) return cls(int(year), int(month), int(day))注意:此处的cls是形参,只是一种代码规范。
4. 完整代码
点击此处前往码云(gitee)获取源码