python decorator

本文深入探讨了Python中的装饰器概念,包括如何将函数用作参数、返回值,以及如何使用装饰器来修改函数的行为。此外,还介绍了如何利用装饰器和类装饰器来增强类的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<

decorator

1 decorator

python中的装饰模式器其实就是对函数进行修改,符号为@

1.1 python中函数可以作为返回值

def newFunc():
    return lambda x: x*x

func = newFunc()
print(func(3))

1.2 函数作为入参

def alterFunc(func):
    print('this func is altered ', func.__name__)
    return lambda x: x+1

def myFunc(x):
    return x*x

myFunc = alterFunc(myFunc)

print(myFunc(5))

1.3 改写函数

def logFunc(func):
    print('this func is loged ', func.__name__)
    def wrapper(*args):
        print('%s is called' % func.__name__)
        # args是一个tuple, *args是把tuple展开后作为函数入参
        result = func(*args)
        print('result is ', result)
        return result
    return wrapper

def myFunc(x):
    return x*x

myFunc = logFunc(myFunc)

print(myFunc(6))

1.4 装饰器改写

def logFunc(func):
    print('this func is loged ', func.__name__)
    def wrapper(*args):
        print('%s is called' % func.__name__)
        # args是一个tuple, *args是把tuple展开后作为函数入参
        result = func(*args)
        print('result is ', result)
        return result
    return wrapper

@logFunc
def myFunc(x):
    return x*x

# 和上面等价的
# def myFunc(x):
#     return x*x

# myFunc = logFunc(myFunc)


print(myFunc(6))

1.5 装饰器可以为一个类

class classDecor:
    def __init__(self, func):
        print('init ')
        self.func = func

    def __call__(self, args):
        print('called ', args)
        result = self.func(args)
        print('called over')
        return result

@classDecor
def myFunc2(x):
    return x*x

print(myFunc2(5))

1.6 类也可以使用装饰器

def addFunc(cls):
    def f1(self, x, y):
        return min(x, x+y)
    cls.f = f1
    return cls

@addFunc    
class C:
    def g(self):
        return 'hello world'

c = C()
print(c.g(), c.f(3, 2))

1.7 类装饰器改写类

class clsFunc:
    def __init__(self, cls):
        print 'try wrap class'
        class wrapperCls(cls):
            def f1(self, x, y):
                return min(x, x+y)
        self.obj = wrapperCls()

    def __call__(self):
        print('clsFunc.__call__ called')
        return self.obj

# in decorator, it will call clsFunc.__init__ to wrap class    
@clsFunc    
class D:
    def g(self):
        return 'hello world'

print('in init obj, it will call clsFunc.__call__') 
d = D()

print('in calling funcs')
print(d.g(), d.f1(3, 2))


Date: 2013-04-15 16:03:48 中国标准时间


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值