浅谈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开发之str.format()用法实例分析
Feb 22 Python
Python实现简单登录验证
Apr 13 Python
深入理解Python变量与常量
Jun 02 Python
python自定义异常实例详解
Jul 11 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
深入理解python中sort()与sorted()的区别
Aug 29 Python
12个步骤教你理解Python装饰器
Jul 01 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
Python 多线程共享变量的实现示例
Apr 17 Python
Python使用Excel将数据写入多个sheet
May 16 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
详解Python中的Lock和Rlock
Jan 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
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
python调用shell的方法
2013/11/20 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
python地震数据可视化详解
2019/06/18 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
给老师的道歉信
2014/01/11 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
爱与责任演讲稿
2014/05/20 职场文书
运动会横幅标语
2014/06/17 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
三严三实心得体会范文
2014/10/13 职场文书
房屋产权证明书
2015/06/19 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
python中的3种定义类方法
2021/11/27 Python