python 静态方法、类方法(二)
《Python静态方法、类方法》一文中曾用在类之外生成函数的方式,来计算类的实例的个数。本文将探讨用静态方法和类方法来实现此功能。
一使用静态方法统计实例
例1.static.py
# -*- coding:utf-8 -*-
class Spam:
numInstance = 0 def __init__(self):
Spam.numInstance += 1 def printNumInstance():
print 'Number of instance:', Spam.numInstance printNumInstance = staticmethod(printNumInstance) # 使用内建函数staticmethod将函数变为静态函数
调用结果:
>>> from static import Spam # 导入类
>>> a, b, c = Spam(), Spam(), Spam() #实例化
>>> Spam.printNumInstance() # 类调用
Number of instance: 3
>>> a.printNumInstance() # 实例调用,实例参数没有被传入
Number of instance: 3
静态方法调用相对于将PirntNumInstance移到类之外的方法相比较,有以下优点:
1.静态方法把函数名称变成类作用域内的局部变量,使得函数名不会与模块内的其它变量名相冲突。
2.把函数程序代码迁移到其靠近使用的地方,易于寻找。
3.允许子类定制静态方法。如例2所示。
例2.custom_made.py
class Sub(Spam): # 子类Sub
def printNumInstance(): # 重新定义
print 'Extra stuff...'
Spam.printNumInstance() printNumInstance = staticmethod(printNumInstance)
调用结果:
>>>a, b = Sub(), Sub() # 实例化
>>> a.printNumInstance() #实例调用
Extra stuff...
Number of instance: 2 #重新启动解释器,进行调用。否则应该为5,因为前面已经有三个实例
>>> Sub.printNumInstance() #类调用
Extra stuff...
Number of instance: 2
此外,类可以继承方法而不用重新定义,如下:
>>> class Other(Spam): # 完全继承静态方法
... pass
...
>>> c = Other()
>>> c.printNumInstance()
Number of instance: 3
二、使用类方法统计实例
例3:a_class.py
#-*- coding:utf-8 -*- class Spam:
numInstance = 0 def __init__(self):
Spam.numInstance += 1 def printNumInstance(cls): # 接收实例的(最底层)类作为参数,传入cls中
print 'Number of instance:', cls.numInstance printNumInstance = classmethod(printNumInstance)
调用结果:
>>> from a_class import Spam #导入模块
>>> a, b = Spam(), Spam() #实例化
>>> a.printNumInstance() #实例调用,传入实例a所在的最底层的类Spam
Number of instance: 2
>>> Spam.printNumInstance() # 类调用,传入类Spam
Number of instance: 2
三总结
由于类方法总是接收一个实例化的类的最底层的类:
1.静态方法:适用于处理一个类的本地数据
2.类方法:适用于处理类层级中每个类的数据
下面的例子(例4)展示了利用类方法管理每个类的实例计数器。例4的代码中,顶层的超类使用一个类方法来管理状态信息,该信息根据树中的类不同而不同,而且储存在类上。
例4:test.py
class Spam:
numInstance = 0 def count(cls):
cls.numInstance += 1 def __init__(self):
self.count() count = classmethod(count) class Sub(Spam):
numInstance = 0 def __init__(self):
Spam.__init__() class Other(Spam):
numInstance = 0
调用结果:
>>>x = Spam()
>>>y1, y2 = Sub(), Sub()
>>>z1, z2, z3 = Other(), Other(), Other()
>>>x.numInstance, y1.numInstance, z1.numInstance
1, 2, 3
>>>Spam.numInstance, Sub.numInstance, Other.numInstance
1, 2, 3
python 静态方法、类方法(二)的更多相关文章
- python静态方法类方法属性方法
Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...
- Python静态方法 类方法
通常情况下,类中函数中定义的所有函数,,都是对象的绑定方法,除此之外,还有专门的静态方法和类方法,这两个是专门给类使用的,但是对象非要调用也是不会报错的. 对象在调用的时候会把自己传递给self,也就 ...
- 关于python的类方法、实例方法和静态方法区别
python的类方法需要在方法前面加装饰器:@classmethod ,静态方法是在方法前面加装饰器:@staticmethod. 类方法.类属性是属于类自身,属于类自身的命名空间,和实例方法.实例属 ...
- Python静态方法(staticmethod)和类方法(classmthod)
Python静态方法(staticmethod)和类方法(classmthod)翻了翻之前的笔记,也刚好看到一篇不错的blog,关于静态方法和类方法的,方便以后查阅,就写在这里了,废话不多说,直接上代 ...
- Python 静态方法、类方法和属性方法
Python 静态方法.类方法和属性方法 静态方法(staticmethod) staticmethod不与类或者对象绑定,类和实例对象都可以调用,没有自动传值效果,Python内置函数staticm ...
- 第八章:Python基础の面向对象(二)
本課主題 面向对象的多态 面向对象的成员 成员修饰符 特殊成员 面向对象其他应用 异常处理 设计模式与单例模式 面向对象的多态 指定参数类型只是多态的一种表现 另外一种是允许自己类型和自己的子类型(典 ...
- python排序之二冒泡排序法
python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...
- IOS—静态方法(类方法)和实例方法
1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象 函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类 函数) c).静态方法 ...
- Python 基础语法(二)
Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...
随机推荐
- iOS获取app图标和启动图片名字(AppIcon and LaunchImage's name)
在某种场景下,可能我们需要获取app的图标名称和启动图片的名称.比如说app在前台时,收到了远程通知但是通知栏是不会有通知提醒的,这时我想做个模拟通知提示,需要用到icon名称:再比如在加载某个控制器 ...
- 3、项目资源的提供 - PMO项目管理办公室
PMO项目管理办公室也需要对项目相关的资源进行提供,从而针对项目的资源也进行标准化和规范化的管理.也就是说,PMO项目管理办公室就是提供项目相关的规范化资源内容,从而统一管理项目相关的内容,达到规范的 ...
- 多War项目中静态文件的共享方案
[原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 在互联网产品中,一般会有多个项目(Jar.WAR)组成一个产品线.这些WAR项目,因为使用相同的前端架构(jQuery.easyui等) ...
- 动态调用WebService
WebService内容 using Microsoft.CSharp;using System;using System.CodeDom;using System.CodeDom.Compiler; ...
- 错误: “WebForm_DoPostBackWithOptions”未定义
无论是ASP.NET WebForm 还是 ASP.NET MVC项目,在本地程序测试没问题,但是部署在IIS上访问就会出现 错误: “WebForm_DoPostBackWithOptions”未 ...
- Python写各大聊天系统的屏蔽脏话功能原理
Python写各大聊天系统的屏蔽脏话功能原理 突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时 ...
- WPF 自定义搜索框
控件中的搜索图标下载地址:http://www.easyicon.net/1183666-Search_icon.html 搜索框设计过程比较简单: 1.先定义一个Rectangle作为背景 2. ...
- 【Linux】AWK入门
什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...
- 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例
初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...
- Apache服务停止:信号灯超时时间已到,指定的网络名不再可用
环境说明:Apache2.4.10,Windows Server 2008 R2 问题说明: apache服务用于下载文件,但是在运行一段时间后,突然挂了. 其错误提示如下所示: [error] (7 ...