目录
1. 装饰器的使用
装饰器使用#语法糖来装饰函数或者类。有带参数和不带参数两种形式,其中不带参数的形式:
a = lambda _test: lambda *args, **kwargs: _test(*args)
@a
def test():
pass
print(test())
带参数的形式:
a = lambda *args, **kwargs: lambda _test: lambda *args, **kwargs: _test(*args, **kwargs)
@a(1, 2)
def test(a):
return a
print(test(1))
1.1 不带参数的装饰器
1.1.1 函数装饰函数
def decoration(_func):
def _wrapper(*args, **kwargs):
return "经过装饰后的func: " + _func(*args, **kwargs)
return _wrapper
@decoration
def func(*args):
args = [str(e) for e in args]
return 'this is function func, args: ({})'.format(", ".join(args))
1.1.2 函数装饰类
def decoration_cls(cls):
def _wrapper(*args, **kwargs):
setattr(cls, '__str__', lambda _: '经过装饰后的类: {}'.format(cls.__qualname__))
return cls(*args, **kwargs)
return _wrapper
@decoration_cls
class A:
def __init__(self):
pass
1.1.3 类装饰函数
class B:
def __init__(self, _func):
self._func = _func
def __call__(self, *args, **kwargs):
return "经过类B装饰后的函数:" + self._func(*args, **kwargs)
@B
def func(*args):
args = [str(e) for e in args]
return 'this is function func, args: ({})'.format(", ".join(args))
1.1.4 类装饰类
class C:
def __init__(self, cls):
self._cls = cls
def __call__(self, *args, **kwargs):
setattr(self._cls, "__str__", lambda _: "经过类C装饰后的类:" + self._cls.__qualname__)
_instance = self._cls(*args, **kwargs)
return _instance
@C
class D:
def __init__(self, *args):
self.args = args
1.2 带参数的装饰器
1.2.1 函数装饰函数
def decoration(*args, **kwargs):
info = 'this is function decoration, args: ({})\n被装饰的函数结果为:\n'.format(", ".join(args))
def _wrapper(func):
def _inner(*args, **kwargs):
return info + func(*args, **kwargs)
return _inner
return _wrapper
@decoration('a')
def func(*args, **kwargs):
return 'this is function func, args: ({})'.format(", ".join(args))
###1。2.1 函数装饰类
def decoration_cls(*args, **kwargs):
info = 'this is function decoration, args: ({})\n被装饰的类为:\n'.format(", ".join(args))
def _wrapper(cls):
def _inner(*args, **kwargs):
setattr(cls, '__str__', lambda _: info + '经过装饰后的类: {}'.format(cls.__qualname__))
return cls(*args, **kwargs)
return _inner
return _wrapper
@decoration_cls('a')
class A:
def __init__(self):
pass
1.2.3 类装饰函数
class A:
def __init__(self, *args, **kwargs):
pass
def __call__(self, func):
def _wrapper(*args, **kwargs):
return "经过类A装饰的函数: " + func(*args, **kwargs)
return _wrapper
@A(1)
def B():
return 'a'
1.2.4 类装饰类
class A:
def __init__(self, *args, **kwargs):
pass
def __call__(self, cls):
def _wrapper(*args, **kwargs):
setattr(cls, '__str__', lambda _: "经过类A装饰后的: " + cls.__qualname__)
return cls(*args, **kwargs)
return _wrapper
@A(1)
class B:
def __init__(self):
pass