python @classmethod

多态,使得继承体系中的多个类都能以各自所独有的方式来实现某个方法。

通过@classmethod,可以用一种与构造器类似的方式来构造类的对象。

   class Data_test(object):
        day=0
        month=0
        year=0
        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()

     如果用户输入的是 "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 类当中呢?但是,Python只允许名为__init__的构造器方法。

那么@classmethod 就开始出场了,针对的是整个类,而不是从该类构建出来的对象。

 class Data_test2(object):
        day=0
        month=0
        year=0
        def __init__(self,year=0,month=0,day=0):
            self.day=day
            self.month=month
            self.year=year
     
        @classmethod
        def get_date(cls,string_date):
            #这里第一个参数是cls, 表示调用当前的类名
            year,month,day=map(int,string_date.split('-'))
            date1=cls(year,month,day)
            #返回的是一个初始化后的类
            return date1
     
        def out_date(self):
            print "year :"
            print self.year
            print "month :"
            print self.month
            print "day :"
            print self.day

     在Date_test类里面创建一个成员函数, 前面用了@classmethod装饰。 它的作用就是有点像静态类,比静态类不一样的就是它可以传进来一个当前类作为第一个参数。
    那么如何调用呢?

 r=Data_test2.get_date("2016-8-6")
 r.out_date()
 输出:
 year :
 2016
 month :
 8
 day :
 1

    这样子等于先调用get_date()对字符串进行出来,然后才使用Data_test的构造函数初始化。
    这样的好处就是你以后重构类的时候不必要修改构造函数,只需要额外添加你要处理的函数,然后使用装饰符 @classmethod 就可以了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值