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中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
Python中set与frozenset方法和区别详解
May 23 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
Python基于matplotlib绘制栈式直方图的方法示例
Aug 09 Python
对Python中数组的几种使用方法总结
Jun 28 Python
Django中使用第三方登录的示例代码
Aug 20 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
python设置环境变量的原因和方法
Jun 24 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
解决python便携版无法直接运行py文件的问题
Sep 01 Python
Python编写万花尺图案实例
Jan 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
PHP return语句的另一个作用
2014/07/30 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
python万年历实现代码 含运行结果
2017/05/20 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
django表单的Widgets使用详解
2019/07/22 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
python微信公众号开发简单流程实现
2020/03/09 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
傲盾软件面试题
2015/08/17 面试题
天网工程实施方案
2014/03/26 职场文书
学校花圃的标语
2014/06/18 职场文书
建筑工地文明标语
2014/10/09 职场文书
小学四年级学生评语
2014/12/26 职场文书
出生公证书
2015/01/23 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL