装饰器
闭包装饰器
装饰器的本质就是一个闭包, 闭包三要素:1 函数嵌套, 2 外部函数返回内部函数的引用, 内部函数使用外部函数的变量
1 使用装饰器简单实现一个登录校验功能
In [1]: user = {
"username": "123", "password": 123}
def outter(func):
...: def inner(*args, **kwargs):
...: if user.get('token'):
...: return func(*args, **kwargs)
...: else:
...: username = input("user:")
...: password = input("pwd:")
...: if user.get("username") == username:
...: user['token'] = True
...: print("login success")
...: return func(*args, **kwargs)
...: else:
...: raise ValueError('login faild')
...: return inner
...:
In [8]: @outter # func = outer(tests)
...: def tests(a, b):
...: print('tests result:',a*b)
...:
In [9]: tests(2,4) # outer(tests)(2, 4)
user:123
pwd:123
login success
tests result: 8
In [10]: tests(2,4)
tests result: 8
In [11]: tests(2,9)
tests result: 18
类中使用的默认装饰器
@classmethod
类中装饰@classmethod魔法方后就属于类方法, 传的第一个参数就是类对象, 可以直接被类对象调用,类方法也可以被实例方法调用,但是类方法不能调用实例方法
使用场景:对于不需要实例化调用的时候调用
class Method:
...: def __init__