@classmethod (类方法)和 @staticmethod(静态方法)

定义一个时间类:

class Data_test(object):
    
    def __init__(self, year=0, month=0, day=0):
        self.day=day
        self.month=month
        self.year=year

    def out_date(self):
        print("year:", self.year)
        print("month:", self.month)
        print("day:", self.day)

我们可以先实例化一个 Data_test 对象,然后再调用 out_date() 方法:

>>> r = Data_test("2017-1-1")
>>> r.out_date()
year: 2017-1-1
month: 0
day: 0

假设有一种场景,用户输入的是字符串 "2017-1-1",我们需要改动 out_date() 函数,让它具有分割处理字符串的功能,才能实现我们的需求。

如果我们不想改动 out_date() 函数呢,解决办法是用 @classmethod (类方法)来给类增加一个处理字符串的函数。

class Data_test(object):
    
    def __init__(self, year=0, month=0, day=0):
        self.day=day
        self.month=month
        self.year=year

    @classmethod
    def get_date(cls, data_as_string):
        """
        输入一个字符串作为参数,根据该字符串得到 year, month, day 的值
        根据这些值实例化一个 Data_test 对象,并返回
        这里第一个参数是cls, 表示调用当前的类名
        """
        year, month, day = map(int, data_as_string.split('-'))

        # 实例化一个 Data_test 对象
        date = cls(year, month, day)
        
        #返回的是一个实例化后的类
        return date
    
    def out_date(self):
        print("year:", self.year)
        print("month:", self.month)
        print("day:", self.day)

测试:

>>> r = Data_test.get_date("2017-1-1")
>>> r.out_date()
year: 2017
month: 1
day: 1

调用类方法的格式是:类名.类方法(),不需要先实例化。





如果用 静态方法 @staticmethod 怎么实现呢?

class Data_test(object):
    
    def __init__(self, year=0, month=0, day=0):
        self.day=day
        self.month=month
        self.year=year

    # 与类方法的区别在于,静态方法不需要 cls 参数
    @staticmethod
    def get_date_static(data_as_string):
        year, month, day = map(int, data_as_string.split('-'))
        return year, month, day
    
    def out_date(self):
        print("year:", self.year)
        print("month:", self.month)
        print("day:", self.day)

调用静态方法的格式是同样是:类名.类方法(),不需要先实例化。

>>> d = Data_test.get_date_static("2017-1-1")
>>> r = Data_test(*d)
>>> r.out_date()
year: 2017
month: 1
day: 1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容