Skip to content

静态方法、类方法以及对象方法及参数

class Date:
    # 构造函数
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __str__(self):
        return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day)

    def tomorrow(self):  # 实例方法,很常见。创建时,Pycharm 会自动补全一个 self 的实例
        self.day += 1

    @staticmethod  # 静态方法,不需要接收 self 或 cls,调用必须用 Date,因为它已经进入到 Date 的命名空间了。
    def parse_from_string(date_str):
        year, month, day = tuple(date_str.split("-"))
        return Date(int(year), int(month), int(day))  # 但是静态方法是用的硬编码的方式,如果 Date 类名字改变,它内部也需要变。

    @classmethod  # 类方法,创建时,Pycharm 会自动补全一个 cls ,即类本身。(其实名称无所谓,只是一种默认规范)
    def from_string(cls, date_str):
        year, month, day = tuple(date_str.split("-"))
        return cls(int(year), int(month), int(day))  # 这里使用类方法,避免了硬编码的方式。

    @staticmethod  # 如果一种功能不需要把类变量传递进来,就没必要用类方法,使用静态方法即可。
    def valid_string(date_str):
        year, month, day = tuple(date_str.split("-"))
        if int(year) > 0 and (0 < int(month) <= 12) and (0 < int(day) <= 31):  # 粗略判断,非实际情况
            return True
        else:
            return False


if __name__ == "__main__":
    new_day = Date(2021, 8, 31)
    new_day.tomorrow()  # Python 内部会直接把 new_day.tomorrow() 转换成 tommorow(new_day) 这种调用形式,参数为 self 实例,即 new_day。
    print(new_day)

    # 2021-8-31
    date_str = "2021-8-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)  # 直接传递 cls,避免了硬编码
    print(new_day)

    print(Date.valid_string("2021-8-32"))