浅谈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中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
python3+PyQt5实现拖放功能
Apr 24 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
Tornado Web Server框架编写简易Python服务器
Jul 28 Python
python禁用键鼠与提权代码实例
Aug 16 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
python实现大文本文件分割成多个小文件
Apr 20 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模拟post上传图片实现代码
2016/06/24 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
Javascript 面向对象特性
2009/12/28 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
轮播图组件js代码
2016/08/08 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
Python中的面向对象编程详解(下)
2015/04/13 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python中正则表达式详解
2017/05/17 Python
Python算法之图的遍历
2017/11/16 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Python接口测试get请求过程详解
2020/02/28 Python
python 安装移动复制第三方库操作
2020/07/13 Python
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
仓库理货员岗位职责
2013/12/18 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
理财学专业自荐书
2014/06/28 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
争先创优演讲稿
2014/09/15 职场文书
晚会开幕词
2015/01/28 职场文书
敬老院活动感想
2015/08/07 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
高中政治教师教学反思
2016/02/23 职场文书