浅谈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中文竖排显示的方法
Jul 28 Python
详解python单例模式与metaclass
Jan 15 Python
python去掉行尾的换行符方法
Jan 04 Python
python使用turtle库绘制树
Jun 25 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
python flask几分钟实现web服务的例子
Jul 26 Python
解决django model修改添加字段报错的问题
Nov 18 Python
django-crontab实现服务端的定时任务的示例代码
Feb 17 Python
Python中有几个关键字
Jun 04 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
python实现图片九宫格分割的示例
Apr 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
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
python三元运算符实现方法
2013/12/17 Python
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
python写入中英文字符串到文件的方法
2015/05/06 Python
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
django实现前后台交互实例
2017/08/07 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
django实现模型字段动态choice的操作
2020/04/01 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
opencv 阈值分割的具体使用
2020/07/08 Python
浅析Python 多行匹配模式
2020/07/24 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
详解pandas赋值失败问题解决
2020/11/29 Python
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
元宵节寄语大全
2015/02/27 职场文书
六一活动主持词
2015/06/30 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python