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和pyqt实现360的CLable控件
Feb 21 Python
Python 抓取动态网页内容方案详解
Dec 25 Python
使用Python从零开始撸一个区块链
Mar 14 Python
python中scikit-learn机器代码实例
Aug 05 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
Jun 19 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
Django基础知识 URL路由系统详解
Jul 18 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 Python
VSCODE配置Markdown及Markdown基础语法详解
Jan 19 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使用JSON和将json还原成数组
2015/02/12 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
传智播客学习之java 反射
2009/11/22 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
详解python之简单主机批量管理工具
2017/01/27 Python
python实现彩票系统
2020/06/28 Python
python os模块简单应用示例
2019/05/23 Python
python自动化之Ansible的安装教程
2019/06/13 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
thinkphp5 路由分发原理
2021/03/18 PHP
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
迎新晚会邀请函
2014/02/01 职场文书
校园公益广告语
2014/03/13 职场文书
公务员保密承诺书
2014/03/27 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年护士节活动总结
2015/02/10 职场文书
2015年材料员工作总结
2015/04/30 职场文书
学校党支部公开承诺书
2015/04/30 职场文书