@classmethod 和 @staticmethod

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的实例,无法使用类的属性。

posted @ 2018-08-30 20:30  bellum  阅读(297)  评论(0编辑  收藏  举报