描述
@staticmethod后接def funcname,
效果等于 funcname=staticmethod(funcname),只是书写简洁一些。
示例
>>> class CountInsBISM:
numOfInstances=0
def __init__(self):
CountInsBISM.numOfInstances+=1
@staticmethod # 等效于 printNumOfIns=staticmethod(printNumOfIns)
def printNumOfIns():
print('创建的实例数为:{}'.format(CountInsBISM.numOfInstances))
>>> cibs1,cibs2,cibs3=CountInsBISM(),CountInsBISM(),CountInsBISM()
>>> CountInsBISM.printNumOfIns()
创建的实例数为:3
描述
Python的__call__运算符重载方法为类实例实现函数调用接口。
即,python类实例对象调用小括号()时,自动调用_call_()方法。
步骤
(1) 构造函数接收被装饰函数;
(2) 重载__call__方法,并且调用被装饰函数;
实例化类实例对象时会接收一个被装饰的函数,通过实例对象名调用小括号()时,会自动调用__call__方法,在__call__方法被调用时,会调用被装饰函数,从而达到函数装饰器的效果。
示例
>>> class mycall:
def __init__(self,func):
self.calls=0
self.func=func
def __call__(self,*args):
self.calls+=1
print('call {} to {}'.format(self.calls,self.func.__name__))
self.func(*args)
#@mycall
#def myecho
#等价于 myecho=mycall(myecho)
>>> @mycall
def myecho(msg):
print(msg)
# myecho('梯阅线条') 会自动调用 mycall类的 __call__ 方法。
>>> myecho('梯阅线条')
call 1 to myecho
梯阅线条
>>> myecho('tyxt.work')
call 2 to myecho
tyxt.work