标签:
今天我们来讨论一下Python类中所存在的特殊方法——静态方法、类方法。
静态方法:
一种简单函数,符合以下要求:
1.嵌套在类中。
2.没有self参数。
特点:
1.类调用、实例调用,静态方法都不会接受自动的self参数。
2.会记录所有实例的信息,而不是为实例提供行为。
类方法:
一种函数,符合以下特征
1.类调用、或实例调用,传递的参数是一个类对象。
程序需要处理与类而不是与实例相关的数据。也就是说这种数据信息通常存储在类自身上,不需要任何实例也可以处理。
例如:
1.记录有一个类创建的实例的数目。
2.维护当前内存中一个类的所有实例的列表。
以上情况也可以同以下方式解决:
在类定义之外生成一个的简单函数
例1:简单函数.py
# 记录一个类创建的实例的数目 def printNumInstance(): # 打印出创建实例的数量 print "Number of instance created:", Spam.numInstance # 调用类数据属性 class Spam: numInstance = 0 def __init__(self): Spam.numInstance = Spam.numInstance + 1 # 每创建一个类,就自加一次
输出结果:
>>> a = Spam() >>> b = Spam() >>> c = Spam() >>> printNumInstance() Number of instance created: 3 >>> Spam.numInstance 3
因为类名称对简单函数而言,是可读取的全局变量,所以看到上例可以正常工作。
此外,函数名变成了全局变量,故仅适用于这个单一模块。
这样处理的缺点如下:
1.给文件的作用域添加了一个额外的名称,该名称仅能处理单个的类,不能应付多个类需要处理的情况。
2.该函数与类的直接关联很小,函数的定义可能在数百行代码之外的位置。
3.该函数位于类的命名空间之外,子类不能通过重新定义来代替或扩展它。
三种方法如例2所示
例2.方法.py
# -*- coding:utf-8 -*- class Methods: """实例方法、静态方法、类方法""" def imeth(self, x): print self, x def smeth(x): # 静态方法不需要self参数 print x def cmeth(cls, x): # 类方法需要一个类参数 print cls, x # 要设计静态方法和类方法,如下,需调用内置函数staticmethod和clsssmethod. smeth = staticmethod(smeth) # 重新赋值方法名称,这些赋值语句会覆盖稍早由def所做的赋值 cmeth = classmethod(cmeth)
1.实例方法调用
实例方法调用一定要将类实例化,方可通过实例调用。
from method import Methods # 导入模块 >>> obj = Methods() #实例化 >>> obj.imeth(1) #实例调用 <method.Methods instance at 0x02D6BD50> 1 #变为imeth(obj, 1) >>> Methods.imeth(obj, 1) #类调用 <method.Methods instance at 0x02D6BD50> 1 #变为imeth(obj, 1)
2.静态方法调用
静态方法调用时不需要实例参数。
>>> Methods.smeth(3) # 类调用 3 # 没有实例被传入 >>> obj.smeth(3) # 实例调用 3 # 实例没有传入
3.类方法调用
类方法调用时,Python会把类(不是实例)传入类方法第一个(最左侧)参数cls(默认)。
>>> Methods.cmeth(5) #类调用 method.Methods 5 #变为cmeth(Methods, 5) >>> obj.cmeth(5) #实例调用 method.Methods 5 #变为cmeth(Methods, 5)
标签:
原文地址:http://www.cnblogs.com/twtp/p/5494383.html