Python中的类常规的方法是需要指定一个实例的,即通常第一个参数为self,表示一个实例。但有些情况下,我们想要处理与类有关,而不是与实例有关的数据,因此,不希望有实例作为参数传进来,比如说我们希望记录由类创建的实例的个数,或者维护一个类中的实例的列表,等等。
对于这样的任务,我们可以在类外写一个函数,访问类的属性,并作出相应操作,如:
def printNum():
print Spam.num
class Spam:
num = 0
def __init__(self):
Spam.num += 1
a = Spam()
b = Spam()
printNum()
但这样的问题在于,类外的这个方法和类是分离的,而且我们不能通过继承这个类来继承这个方法。
1.python中通过静态方法来实现不需要传递self的方法。
class Spam:
num = 0
def __init__(self):
Spam.num += 1
def printNum():
print Spam.num
printNum = staticmethod(printNum)
class Sub(Spam):
pass
a = Sub()
b = Sub()
Sub.printNum()
2.python中类方法可以将类作为第一个参数
class Spam:
num = 0
def __init__(self):
Spam.num += 1
def printNum(cls):
print cls.num
printNum = classmethod(printNum)
class Sub(Spam):
pass
a = Sub()
b = Sub()
Sub.printNum()
同样可以实现我们要的功能
3.静态方法和类方法也可以用函数装饰器来写
class Spam:
num = 0
def __init__(self):
Spam.num += 1
@staticmethod
def printNum():
print Spam.num
class Sub(Spam):
pass
a = Spam()
b = Sub()
c = Sub()
Sub.printNum()
Spam.printNum()
class Spam:
num = 0
def __init__(self):
Spam.num += 1
@classmethod
def printNum(cls):
print cls.num
class Sub(Spam):
pass
a = Spam()
b = Sub()
c = Sub()
Sub.printNum()
Spam.printNum()