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脚本实现xls(xlsx)转成csv
Apr 10 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python基础教程项目四之新闻聚合
Apr 02 Python
python实现换位加密算法的示例
Oct 14 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
Django实现基于类的分页功能
Oct 31 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
python3正则模块re的使用方法详解
Feb 11 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 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
php UBB 解析实现代码
2011/11/27 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
php中__toString()方法用法示例
2016/12/07 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
简单介绍Python中的try和finally和with方法
2015/05/05 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
python机器学习实现决策树
2019/11/11 Python
Yahoo-PHP面试题2
2014/12/06 面试题
销售主管的自我评价分享
2014/01/03 职场文书
幼儿园家长寄语
2014/04/02 职场文书
献爱心标语
2014/06/21 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
python 闭包函数详细介绍
2022/04/19 Python