Python装饰器和__call__函数

__call__

在python中,函数其实是一个可调用的对象,实例对象可以用函数的形式表示

一个类实例可以变成一个可调用的对象,只需要实现方法__call__()

一、把类Myclass变成可调用的对象:

class Myclass(object):
    
    def __init__(self, fn):
        self.name = fn
        print fn
        
    def __call__(self, *args, **kwargs):
        print "My name is ..."
        self.name(*args, **kwargs)
        print "My friend is ..."

def getInfo(test):
    print test

cls = Myclass(getInfo)
cls('Tim')

打印:
<function myfun at 0x1005ed2a8>
<function getInfo at 0x1005e0ed8>
My name is ...
Tim
My friend is ...

二、把实例对象用类似于函数的形式表示,

class Test():
    def __init__(self):
        pass
    
    def __call__(self, num):
        sum = 0
        for i in range (num):
            sum += i
        return sum

t = Test()
print t(10)
打印:
45

Python装饰器:使用类来定义装饰器(Python中类实例可以当做函数一样调用)

class Myclass(object):
    
    def __init__(self, fn):
        self.name = fn
        print fn
        
    def __call__(self, *args, **kwargs):
        print "My name is ..."
        self.name(*args, **kwargs)
        print "My friend is ..."

def getInfo(ni):
    print ni

@Myclass
def myfun(name, gender):
    print "start..."
    print name
    print gender
    print "end..."

myfun('Bob', 'male')
打印:
<function myfun at 0x1005ee2a8>
My name is ...
start...
Bob
male
end...
My friend is ...

 小编只是举个例子。小编在实际项目中的调用场景是:

一、计算一个网页的pv流量

二、控制某些网页的访问,例如必须登录才能访问

三、在某些函数的前后打印必要的日志信息

综上:都是为了简化函数的一些流程,将统一的代码规范化,避免函数一些共性的代码重复书写

猜你喜欢

转载自jy-damon.iteye.com/blog/2357024