Python OOP(2)-static method,class method and instance method
静态方法(Static Method):
一种简单函数,符合以下要求:
1.嵌套在类中。
2.没有self参数。
特点:
1.类调用、实例调用,静态方法都不会接受自动的self参数。
2.会记录所有实例的信息,而不是为实例提供行为。
简单说staticmethod 无法访问类属性、实例属性,相当于一个相对独立的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已。
#!python2
#-*- coding:utf-8 -*- class A:
v1="class argu" def __init__(self):
self.v1="instance argu" def fun1():
print "Static fun" fun1=staticmethod(fun1) a=A() #实例调用
a.v1 'instance argu' #类调用
A.v1 'class argu' a.fun1() A.fun1()
另一种写法是在python2.4以后用装饰器decorator
#!python2
#-*- coding:utf-8 -*- class A:
v1="class argu" def __init__(self):
self.v1="instance argu" @staticmethod def fun1():
print "Static fun" a=A() #实例调用
a.v1 'instance argu' #类调用
A.v1 'class argu' a.fun1() A.fun1()
类方法(Class Method):
一种函数,符合以下特征
1.类调用、或实例调用,传递的参数是一个类对象。
注意classmethod 可以访问类属性,无法访问实例属性。上述的变量val1,在类里是类变量,在实例中又是实例变量,所以容易混淆
适用于:
程序需要处理与类而不是与实例相关的数据。也就是说这种数据信息通常存储在类自身上,不需要任何实例也可以处理。
例如:
1.记录有一个类创建的实例的数目。
2.维护当前内存中一个类的所有实例的列表。
以上情况也可以同以下方式解决:
在类定义之外生成一个的简单函数
#记录实例创建数目 def amountinstance():
print "Amount of instances is : %d" %(c1.numInstance) class c1:
numInstance=0
def __init__(self):
c1.numInstance+=1 a=c1()
b=c1()
c=c1()
amountinstance() 3
因为类名称对简单函数而言,是可读取的全局变量,所以看到上例可以正常工作。
此外,函数名变成了全局变量,故仅适用于这个单一模块。
这样处理的缺点如下:
1.给文件的作用域添加了一个额外的名称,该名称仅能处理单个的类,不能应付多个类需要处理的情况。
2.该函数与类的直接关联很小,函数的定义可能在数百行代码之外的位置。
3.该函数位于类的命名空间之外,子类不能通过重新定义来代替或扩展它。
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
def staticmd():
print '静态方法,无法访问val1和val2'
smd = staticmethod(staticmd) def classmd(cls):
print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'
cmd = classmethod(classmd) mc = MyClass()
mc.cmd() 类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值 MyClass.cmd() 类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
另一种写法是在python2.4以后用装饰器decorator
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2' @staticmethod def staticmd():
print '静态方法,无法访问val1和val2' @classmethod def classmd(cls):
print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值' mc = MyClass()
mc.classmd() 类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值 MyClass.classmd() 类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值 #实例的val1与类的val1是不一样的,类方法可以访问的是类的val1 mc.val1 = 'Value changed'
mc.classmd()
类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值 MyClass.classmd()
类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值 MyClass.val1='Value changed'
mc.classmd() 类方法,类:__main__.MyClass,val1:Value changed,无法访问val2的值 MyClass.classmd() 类方法,类:__main__.MyClass,val1:Value changed,无法访问val2的值
最后汇总instance method, static method 和class method 的实现和调用
#!python2
#-*- coding:utf-8 -*- class Methods(): def im(self,v2):
self.v2=v2
print "Call instance method: %d " % v2 @staticmethod def sm(v2):
print "Call static method: %d " % v2 @classmethod def cm(cls,v2):
print "Call class method: %d " % v2 obj=Methods() #instance method call
#实例方法调用一定要将类实例化,方可通过实例调用 obj.im(1) Call instance method: 1 Methods.im(obj,1) Call instance method: 1 #static method call
#静态方法调用时不需要实例参数
obj.sm(2) Call static method: 2 Methods.sm(2) Call static method: 2 #class method call
# 类方法调用时,Python会把类(不是实例)传入类方法第一个(最左侧)参数cls(默认) obj.cm(3) Call class method: 3 Methods.cm(3) Call class method: 3
Python OOP(2)-static method,class method and instance method的更多相关文章
- Python OOP(1):从基础开始
本文旨在Python复习和总结: 1.如何创建类和实例? # 创建类 class ClassName(object): """docstring for ClassNam ...
- <转>Python OOP(1):从基础开始
转自 http://www.cnblogs.com/BeginMan/p/3510786.html 本文旨在Python复习和总结: 1.如何创建类和实例? # 创建类 class ClassNam ...
- (细节控)swift3.0与融云IMKIT开发问题(一部分) override func onSelectedTableRow Method does not override any method from its superclass
原官网文档方案如下,在swift3.0的情况下出现 override func onSelectedTableRow Method does not override any method from ...
- org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call method test() on null context object
前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题. 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法,又多此一举的单独整 ...
- Day04 -玩弄Ruby的方法:instance method与class method
前情提要在第三天时,我们解说了如何在class里用include与extend,去使用module的method. Include is for adding methods to an instan ...
- iOS升级swift3 遇到Overriding non-open instance method outside of its defining module的解决方案
最近将我之前的一个swift项目升级swift3,说多了都是泪... 其中,遇到这样一个错误: 这是用的三方:ENSwiftSideMenu时引出的 报了两个错: 1.Cannot inherit f ...
- Swift protocol extension method is called instead of method implemented in subclass
Swift protocol extension method is called instead of method implemented in subclass protocol MyProto ...
- Python OOP知识积累
目录 目录 前言 对象 类 面向对象 Python 面向对象编程三个基本特征 封装 继承 继承的作用 泛化与特化 实现继承的方式 多重继承 多态 方法多态 最后 前言 Python是一个功能非常强大的 ...
- Python OOP面向对象
一.什么是面向对象的程序设计 1.面向过程 程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是 ...
随机推荐
- C#制作ActiveX控件中调用海康SDK的问题
事情是这样的,有一台海康威视的摄像头,客户需要一个ActiveX控件嵌入到网页中,通过点击按钮开始录制和结束录制来进行视频的录制和保存,关于海康摄像头的二次开发在此就不多说了,可以参考SDK中的说明. ...
- SQL Server统计信息:问题和解决方式
在网上看到一篇介绍使用统计信息出现的问题已经解决方式,感觉写的很全面. 在自己看的过程中顺便做了翻译. 因为本人英文水平有限,可能中间有一些错误. 假设有哪里有问题欢迎大家批评指正.建议英文好的直接看 ...
- Mac下面的SecureCRT(附破解方案) 更新到最新的7.3.2(转)
转自 http://bbs.weiphone.com/read-htm-tid-6939481.html 继续更新到7.3.2的破解.只是升级了下secureCRT到7.3.2,方法还是不变 相信很多 ...
- linux rm -rf * 文件恢复记
手太快,肠子都毁清了.本来是删除一个文件 rm path/myfile.txt结果不知为何加了个*,变成了rm path/myfile.txt *赶紧ls,发现所有代码都化为了乌有,还没提交,还没备份 ...
- MySQL中in(常量列表)的执行计划
我们在写sql的时候,经常用到in,in后面跟一堆常量列表,如id.有人说in的效率很高,而有人说很低:有人说in能使用索引,还有人说in不能使用索引... 到底是一个怎样的情况呢?我们分析以下几种情 ...
- css 选择器之子元素
/*html*/ <div class="wrap"> <span>1</span> <span>2</span> &l ...
- 修改Liunx服务器SSH端口
为提高Linux系统安全性,我们经常会修改ssh端口,下面以CentOS 6为例: vi /etc/ssh/sshd_config 修改ssh端口,默认配置如下: 修改为自己想要的端口号(小于6553 ...
- 【Caffe】caffemodel的大小计算(转载)
看到一篇将如何计算caffemodel大小的blog,感觉对理解模型大小很有帮助. 原文地址:http://blog.csdn.net/u014696921/article/details/52413 ...
- php函数unserialize数据返回false问题分析
unserialize的这个问题是由一个emlog论坛用户在使用时报错而发现的 问题表现情况如下: emlog缓存的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放, ...
- 第5章 网页下载器和urllib2模块
网页下载器:将互联网上URL对应的网页下载到本地的工具 通过网页下载器将互联网中的url网页,存储到本地或内存字符串 python有哪几种网页下载器? 1.urllib2 python官方基础模块 ...