Python函数装饰器基础举例

1 Python函数装饰器基础举例

1.1 用@staticmethod统计实例数

描述

@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

1.2 用__call__实现函数装饰器

描述

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

你可能感兴趣的:(python,python)