关于python的装饰器@classmethod

Python的@classmethod装饰器用于将方法转换为类方法,允许接收类作为参数而不是实例。通过使用@classmethod,可以在不修改类的构造函数(__init__)的情况下,添加处理函数,如将字符串转换为日期格式,从而实现代码的灵活性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@classmethod:装饰器。顾名思义,对原物件进行外部修饰,不做内里的改变。

classmethod是用来指定一个类的方法为类方法,即顶着@classmethod所定义的函数,其所传递参数可为一个类,而非仅限于一般格式的诸如int、boolean等类型的参数。

使用方法如下:

class C:
    @classmethod
    def f(cls, arg1, arg2, ...): ...

实例说明:

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:"
        print self.year
        print "month:"
        print self.month
        print "day:"
        print self.day

t = Data_test(2016,8,1)
t.out_date()

输出:

year:
2016
month:
8
day:
1

如果用户输入的是"2016-8-1" 这样的字符格式,那么就需要调用Date_test 类前做一下处理:

string_date='2016-8-1'
year,month,day=map(int,string_date.split('-'))
s=Data_test(year,month,day)

先把“2016-8-1”分解成 year,month,day 三个变量,然后转成int,再调用Date_test(year,month,day)函数。 也很符合期望。

能否把这个字符串处理的函数放到 Date_test 类当中呢?此时可使用装饰器@classmethod

class Data_test_1(object):

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

    @classmethod 
    # 新添函数get_date。get_date函数的第一个参数是cls,表示调用当前类Data_test_1
    def get_date(cls, data_as_string): 
        year, month, day = map(int, data_as_string.split('-'))
        newDate = cls(year, month, day) # 返回的newDate是一个初始化后的类对象
        return newDate
    
    def out_date(self):
        print "year:"
        print self.year
        print "month:"
        print self.month
        print "day:"
        print self.day

调用:

r = Data_test_1.get_date("2016-8-1") # 先调用装饰器修饰的类函数,再走__init__
r.out_date()

输出:

year:
2016
month:
8
day:
1

这样子等于先调用装饰器@classmethod修饰的get_date()对字符串进行处理,然后才使用Data_test的构造函数初始化。
 

这样的好处就是以后重构类的时候不必要修改构造函数(即如果重构类,想要传参格式从(2006,01, 08)改成"2016-01-08",一般思路是修改类的__init__,但会同时影响本类中其他函数所需形参的参数格式。)只需要额外添加你要处理的函数(本例中添加了get_date())然后使用装饰符 @classmethod 就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值