浅谈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 相关文章推荐
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
python打开url并按指定块读取网页内容的方法
Apr 29 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
django 取消csrf限制的实例
Mar 13 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 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截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
php实现微信公众号无限群发
2015/10/11 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
php框架知识点的整理和补充
2021/03/01 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
js文字横向滚动特效
2015/11/11 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
python实现弹跳小球
2019/05/13 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
工商管理应届生求职信
2013/10/07 职场文书
新学期开学寄语
2014/01/18 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
文明寄语大全
2014/04/11 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
股权转让协议范本
2014/12/07 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
实习指导老师意见
2015/06/04 职场文书
诚信考试主题班会
2015/08/17 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
element多个表单校验的实现
2021/05/27 Javascript
Python函数中apply、map、applymap的区别
2021/11/27 Python
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技
python中validators库的使用方法详解
2022/09/23 Python