浅谈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使用cookielib库示例分享
Mar 03 Python
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
python将字符串转换成数组的方法
Apr 29 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
Python实现的下载网页源码功能示例
Jun 13 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 Python
Flask中sqlalchemy模块的实例用法
Aug 02 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
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
Django卸载之后重新安装的方法
2017/03/15 Python
Sanic框架应用部署方法详解
2018/07/18 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
2014年团工作总结
2014/11/27 职场文书
打架检讨书范文
2015/01/27 职场文书
红旗渠导游词
2015/02/09 职场文书
销售员岗位职责范本
2015/04/11 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
职工的安全责任书范文!
2019/07/02 职场文书