浅谈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 相关文章推荐
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
Python获取运行目录与当前脚本目录的方法
Jun 01 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
python celery分布式任务队列的使用详解
Jul 08 Python
通过实例了解python property属性
Nov 01 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
Python 爬虫性能相关总结
Aug 03 Python
pycharm如何设置官方中文(如何汉化)
Dec 29 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
Python实现简单的猜单词
Jun 15 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/11/14 PHP
php 无法载入mysql扩展
2010/03/12 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python更改已存在excel文件的方法
2018/05/03 Python
python绘制中国大陆人口热力图
2018/11/07 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
python爬虫 正则表达式解析
2019/09/28 Python
Django密码存储策略分析
2020/01/09 Python
Python求解排列中的逆序数个数实例
2020/05/03 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
优秀实习生感言
2014/03/01 职场文书
幸福家庭标语
2014/06/27 职场文书
公司周年庆典标语
2014/10/07 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
围城读书笔记
2015/06/26 职场文书
小学教代会开幕词
2016/03/04 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书