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抓取京东价格分析京东商品价格走势
Jan 09 Python
python文件操作之目录遍历实例分析
May 20 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python实现查看系统启动项功能示例
May 10 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
Python的几种主动结束程序方式
Nov 22 Python
python基于opencv检测程序运行效率
Dec 28 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
分享3个非常实用的 Python 模块
Mar 03 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
基于opencv实现简单画板功能
2020/08/02 Python
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript