浅谈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实现telnet客户端的方法
Apr 15 Python
python从入门到精通(DAY 2)
Dec 20 Python
python实现的正则表达式功能入门教程【经典】
Jun 05 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python os.path模块常用方法实例详解
Sep 16 Python
如何利用Boost.Python实现Python C/C++混合编程详解
Nov 08 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
Python如何调用JS文件中的函数
Aug 16 Python
python快速排序的实现及运行时间比较
Nov 22 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
pycharm部署、配置anaconda环境的教程
Mar 24 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
Python读写Excel表格的方法
2021/03/02 Python
Java如何格式化日期
2012/08/07 面试题
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
留学推荐信怎么写
2014/01/25 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python