浅谈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 pygame安装过程笔记
Jun 05 Python
django 2.0更新的10条注意事项总结
Jan 05 Python
python模块smtplib学习
May 22 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
python中从for循环延申到推导式的具体使用
Nov 29 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
Django中F函数的使用示例代码详解
Jul 06 Python
python如何修改文件时间属性
Feb 05 Python
python元组拆包实现方法
Feb 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
PR值查询 | PageRank 查询
2006/12/20 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
django实现分页的方法
2015/05/26 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
自学考试自我鉴定范文
2013/09/26 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
防止web项目中的SQL注入
2021/12/06 MySQL