浅谈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创建关联数组(字典)的方法
May 04 Python
深入解析Python中的WSGI接口
May 11 Python
python实现排序算法解析
Sep 08 Python
python对象与json相互转换的方法
May 07 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
使用Python的turtle模块画国旗
Sep 24 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
python之array赋值技巧分享
Nov 28 Python
python模拟实现斗地主发牌
Jan 07 Python
Python flask路由间传递变量实例详解
Jun 03 Python
python实现学生成绩测评系统
Jun 22 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 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
php5 and xml示例
2006/11/22 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
JS 自动安装exe程序
2008/11/30 Javascript
web前端开发也需要日志
2010/12/09 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
详解jQuery选择器
2016/12/21 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
解析vue中的$mount
2017/12/21 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
Python开发的HTTP库requests详解
2017/08/29 Python
python实现三维拟合的方法
2018/12/29 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
flask开启多线程的具体方法
2020/08/02 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
应用电子技术专业个人求职信
2013/09/21 职场文书
中英文自我评价语句
2013/12/20 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
Python中glob库实现文件名的匹配
2021/06/18 Python
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
Python pyecharts绘制条形图详解
2022/04/02 Python
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers