1. 定义:
@classmethod: 当调用此方法时,将类作为第一个参数而不是该类的实例传递(正如我们通常使用的方法)。这意味着可以在该方法中使用类及其属性,而不是特定实例。
@staticmethod: 当调用此方法时,不会将类的实例传递给它(正如我们通常使用的方法)。这意味着可以将一个函数放在一个类中,但该函数无法访问该类的实例(当您的方法不使用该实例时,这很有用)。
2. 相同与差异
@classmethod | @staticmethod | |
相同 |
调用方式; 可以通过实例或者其本身调用 class C: @classmethod def f(cls, arg1, arg2,...): pass 可以用一下方式调用 C.f() 或者 C().f() |
调用方式; 可以通过实例或者其本身调用 class C: @staticmethod def f(cls, arg1, arg2,...): pass 可以用一下方式调用 C.f() 或者 C().f() |
不同 |
继承支持: 定义通过继承可改变 |
继承支持: 定义通过继承不可改变 |
对象参数传递: 必须通过隐式传递(cls) |
对象参数传递: N/A |
3. 案例
Class Date(object): def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year @classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date1 = cls(day, month, year) return date1 @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 date2 = Date.from_string('11-09-2012') is_date = Date.is_date_valid('11-09-2012') isinstance(date2, Date) #True isinstance(is_date, Date) #False date2.month # 9 is_date.month # AttributeError: 'bool' object has no attribute 'month'
类Date用来存储某一天的日期信息。
@classmethod 实现功能(date字符串的解析),并且被封装到类Date中,且继承Date的子类也可以调用。
@staticmethod 实现功能(验证日期),但is_date并不是Date的实例,无法使用类的属性。