python 类方法、静态方法和实例方法

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)
相关文章
相关标签/搜索