python @classmethod 的使用场合详解


Posted in Python onAugust 23, 2019

官方的说法:

classmethod(function)

中文说明:

classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法,使用方法如下:

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

看后之后真是一头雾水。说的啥子东西呢???

自己到国外的论坛看其他的例子和解释,顿时就很明朗。 下面自己用例子来说明。

看下面的定义的一个时间类:

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

输出:

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_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,data_as_string):
    #这里第一个参数是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 就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的字典使用分享
Jul 31 Python
pandas修改DataFrame列名的方法
Apr 08 Python
Numpy掩码式数组详解
Apr 17 Python
Python实现输出某区间范围内全部素数的方法
May 02 Python
在windows下Python打印彩色字体的方法
May 15 Python
Python中numpy模块常见用法demo实例小结
Mar 16 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python中update的基本使用方法详解
Jul 17 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
变长双向rnn的正确使用姿势教学
May 31 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 #Python
python 类的继承 实例方法.静态方法.类方法的代码解析
Aug 23 #Python
Python中最好用的命令行参数解析工具(argparse)
Aug 23 #Python
详解Python并发编程之创建多线程的几种方法
Aug 23 #Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 #Python
python Kmeans算法原理深入解析
Aug 23 #Python
Python高级特性 切片 迭代解析
Aug 23 #Python
You might like
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
php时间戳转换的示例
2014/03/31 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
python爬取51job中hr的邮箱
2016/05/14 Python
requests和lxml实现爬虫的方法
2017/06/11 Python
python实现媒体播放器功能
2018/02/11 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Python日志器使用方法及原理解析
2020/09/27 Python
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
会计工作决心书
2014/03/11 职场文书
商业项目策划方案
2014/06/05 职场文书
教师求职自荐书
2014/06/14 职场文书
拓展训练激励口号
2014/06/17 职场文书
应届生自荐书
2014/06/23 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
go开发alertmanger实现钉钉报警
2021/07/16 Golang