浅谈python中的实例方法、类方法和静态方法


Posted in Python onFebruary 17, 2017

在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法,self一般是在实例方法中使用,而cls则一般在类方法中使用,在静态方法中则不需要使用一个默认参数。在下面的代码中,InstanceMethod类的方法中,第一个参数是默认的self,在这里可以把self换成任何名字来表示,不会有任何影响。在类调用的时候,需要满足参数的个数要求(参数中含有*args是例外),例如13行中,类调用没有参数的时候,会提示错误。同样,实例方法的参数个数也应该满足要求,例如16行中也会报错。实例方法的一个主要特点就是需要绑定到一个对象上,python解析器会自动把实例自身传递给方法,如14行所示,而直接使用InstanceMethod.f1()调用方法是不行的。

class InstanceMethod(object):
 def __init__(self, a):
  self.a = a
 def f1(self):
  print 'This is {0}.'.format(self)
 def f2(self, a):
  print 'Value:{0}'.format(a)
if __name__ == '__main__':
 # im = InstanceMethod()
 im = InstanceMethod('233')
 im.f1()
 # im.f2()
 im.f2(233)

静态方法和类方法都需要使用修饰器,分别使用的是staticmethod和classmethod。静态方法是和类没有关系的,我觉得就是包装在类中的一般方法,如下例子中,调用静态方法使用实例和不使用实例都是可以的。类方法中,默认的第一个参数使用的是cls,类方法也可以不需要实例而直接使用类调用。对于这三种不同的方法,使用方法如下例所示。那么问题来了,既然有了实例方法,类方法和静态方法与之相比又有什么好处呢?

在类方法中,不管是使用实例还是类调用方法,都会把类作为第一个参数传递进来,这个参数就是类本身。如果继承了这个使用类方法的类,该类的所有子类都会拥有了这个方法,并且这个方法会自动指向子类本身,这个特性在工厂函数中是非常有用的。静态方法是和类与实例都没有关系的,完全可以使用一般方法代替,但是使用静态方法可以更好的组织代码,防止代码变大后变得比较混乱。类方法是可以替代静态方法的。静态方法不能在继承中修改。

class test(object):
 def instance_method(self):
  print 'This is {0}'.format(self)
 @staticmethod
 def static_method():
  print 'This is static method.'
 @classmethod
 def class_method(cls):
  print 'This is {0}'.format(cls)
if __name__ == '__main__':
 a = test()
 a.instance_method()
 a.static_method()
 a.class_method()
 print '----------------------------------------'
 # test.instance_method()
 test.static_method()
 test.class_method()

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Python 相关文章推荐
Python实现字符串匹配算法代码示例
Dec 05 Python
Python3 中文文件读写方法
Jan 23 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
python实现自动发送邮件
Jun 20 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
python进阶之自定义可迭代的类
Aug 20 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
Python实现视频中添加音频工具详解
Dec 06 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 #Python
python字符串中的单双引
Feb 16 #Python
使用PyV8在Python爬虫中执行js代码
Feb 16 #Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 #Python
Python变量和数据类型详解
Feb 15 #Python
Django学习笔记之Class-Based-View
Feb 15 #Python
关于Python面向对象编程的知识点总结
Feb 14 #Python
You might like
PHP新手上路(十二)
2006/10/09 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
Python实现SVN的目录周期性备份实例
2015/07/17 Python
python如何读取bin文件并下发串口
2019/07/05 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
NET程序员上机面试题
2015/05/23 面试题
生物技术研究生自荐信
2013/11/12 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
《金子》教学反思
2014/04/13 职场文书
亚运会口号
2014/06/20 职场文书
2014最新实习证明模板
2014/10/02 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
防震减灾主题班会
2015/08/14 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
python自然语言处理之字典树知识总结
2021/04/25 Python