类方法和静态方法

经典的例子

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')

classmethod

  1. 由于python类中只能有一个初始化方法,不能按照不同的情况初始化类。所以类方法常用来模拟多个构造函数(重构构造函数)
  2. 子类的实例继承了父类的类方法,调用该方法,调用的是子类的方法和类属性

staticmethod

  • 一般的使用场景是和类相关的操作,但又不依赖和改变类、实例的状态。
    • 例如要实现某一个类的全局计数功能,就可以使用classmethod封装新建实例的操作。
    • 子类的实例继承父类的静态方法,调用该方法,调用的是父类的方法和父类的类属性。
  • staticmethod 主要用途是限定 namespace,也就是说这个函数虽然是个普通的 function ,但是它只有这个 class 会用到,不适合作为 module level 的 function。这时候就把它作为 staticmethod 。如果不考虑 namespace 的问题的话直接在 module 里面 def function 就行了。