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 IDLE加上自动补全和历史功能
Nov 30 Python
python中对数据进行各种排序的方法
Jul 02 Python
对YOLOv3模型调用时候的python接口详解
Aug 26 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
10个Python面试常问的问题(小结)
Nov 20 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
超级实用的8个Python列表技巧
Aug 24 Python
python regex库实例用法总结
Jan 03 Python
python获取对象信息的实例详解
Jul 07 Python
Python编程编写完善的命令行工具
Sep 15 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 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
2019/08/26 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
华为c/c++笔试题
2016/01/25 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
生日宴会答谢词
2014/01/09 职场文书
问卷调查计划书
2014/01/10 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
2016国庆促销广告语
2016/01/28 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android