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.面向过程 程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是 ...
随机推荐
- Memcache遍历查询所有键值的方法
直接举个Telnet命令行下遍历memcached所有key的方法: stats items STAT items:7:number1 STATitems:7:age188 END stats c ...
- 使Gallery时设置居左显示
Gallery中的图片默认是居中显示的.可是在非常多情况下我们须要它居左显示,这样做有一个简单方法.就是把Gallery的left设置为负多少,如以下的方法: Drawable drawable=ca ...
- Java交通灯系统
交通灯管理项目模拟了对十字路口交通灯的控制,一般在我们生活中的十字路口是有人行道的,而此项目没有考虑人行道.具体需求如下: 1.异步随机生成按照各个路线行驶的车辆. 例如: ...
- stage3D基础五-----Working with 3D cameras(转)
原文地址:http://www.adobe.com/cn/devnet/flashplayer/articles/3d-cameras.html 原文是英文的,这里就不贴了,内容主要介绍直接使用相机坐 ...
- iOS 解决TableView reloadData时cell中图片会闪的问题
tableView调用reloaddata的时候发现有个小问题,每次刷新图片都会抖动闪烁一下,看着很难受,也影响体验.造成这个问题的主要原因是因为刷新时候切换图片导致.要解决这个问题也很好解决,使用S ...
- FILE 创建
public class CreateDelFileUtils implements Serializable{ /** * */ private static final long serialVe ...
- nginx 的uri、request_uri 区别
在nginx中有几个关于uri的变量,包括$uri $request_uri $document_uri,下面看一下他们的区别 : $request_uri: /stat.php?id=1585378 ...
- 交易应用及网站驱动不兼容Windows 10的解决方案
微软公司于2015年7月29日正式发布了Windows 10操作系统.全球范围内已有数以千万计的用户踊跃地升级到了Windows 10,在新用户享受Windows 10所带来的全新使用体验的同 ...
- java栈的最大深度?
1. 概述 某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^ 一直记着,今天搞一下 2. 代码 package com.goodfan.test; public class JavaSta ...
- 从零开始学android -- dialog
先看个效果图 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <Linear ...