浅谈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 相关文章推荐
简单的Python2.7编程初学经验总结
Apr 01 Python
python实现一次创建多级目录的方法
May 15 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
Python中使用支持向量机SVM实践
Dec 27 Python
Python参数类型以及常见的坑详解
Jul 08 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
python装饰器使用实例详解
Dec 14 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
Python实现手绘图效果实例分享
Jul 22 Python
Python如何给函数库增加日志功能
Aug 04 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 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上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
python中lambda()的用法
2017/11/16 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
Python能做什么
2020/06/02 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
大专毕业生自我鉴定
2013/11/21 职场文书
网站开发实习生的自我评价
2013/12/11 职场文书
班组长工作职责
2013/12/25 职场文书
党风廉政承诺书
2014/03/27 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
党建工作整改措施
2014/10/28 职场文书
公司捐书倡议书
2015/04/27 职场文书
校园之声广播稿
2015/08/18 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers
SQL Server中使用表变量和临时表
2022/05/20 SQL Server