定义方式的不同

使用目的的不同

示例

假设有一个时间的类:

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

    def tomorrow(self):
        self.day += 1

接下来,遇到一个问题,如果实例化这个类时参数的格式是(‘dd-mm-yyyy’) 这样的,要怎么办呢? 这个时候classmethod就非常好用:

@classmethod
    def from_string(cls, date_str):
        year, month, day = tuple(date_str.split("-"))
        return cls(int(year), int(month), int(day))

下面的写法便于理解:

@classmethod
def from_string(cls, date_as_string):
    day, month, year = map(int, date_as_string.split('-'))
    date1 = cls(day, month, year)
    return date1

date2 = Date.from_string('11-09-2012')

那么staticmethod可以解决什么问题呢?这里假设需要对时间进行校验,就可以用下面这个staticmethod来完成:

@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

# usage
is_date = Date.is_date_valid('11-09-2012')

可以看出来,staticmethod定义的方法在逻辑上是属于这个类的,但在调用的时候却不需要任何类的实例化.