浅谈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 相关文章推荐
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
Python实现按中文排序的方法示例
Apr 25 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
Python socket实现的简单通信功能示例
Aug 21 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
聊聊Python中关于a=[[]]*3的反思
Jun 02 Python
python数字图像处理之图像的批量处理
Jun 28 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 Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
使用php计算排列组合的方法
2013/11/13 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
javascript闭包功能与用法实例分析
2017/04/06 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
Python单链表的简单实现方法
2014/09/23 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
python正则表达式面试题解答
2020/04/28 Python
python实现二维插值的三维显示
2018/12/17 Python
Python常用的json标准库
2019/02/19 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
李宁官方网店:中国运动品牌
2017/11/02 全球购物
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
我们的节日春节活动方案
2014/08/22 职场文书
公诉意见书范文
2015/06/05 职场文书
java调用Restful接口的三种方法
2021/08/23 Java/Android