浅谈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 相关文章推荐
安装dbus-python的简要教程
May 05 Python
Python字符串格式化输出方法分析
Apr 13 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Python实现的简单排列组合算法示例
Jul 04 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
pytorch中的transforms模块实例详解
Dec 31 Python
python logging.basicConfig不生效的原因及解决
Feb 20 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 Python
Pycharm修改python路径过程图解
May 22 Python
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 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
基于laravel制作APP接口(API)
2016/03/15 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
jquery实现数字输入框
2017/02/22 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
Python常用随机数与随机字符串方法实例
2015/04/09 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
生产管理的三大手法
2013/11/11 职场文书
原材料检验岗位职责
2014/03/15 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
自荐信模板大全
2015/03/27 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle
MySQL中连接查询和子查询的问题
2021/09/04 MySQL