Python装饰器
一、函数装饰器
1.无参装饰器
# 装饰器定义
def outter_wrapper(fun):
def inner_fun(*args, **kwargs):
内层函数体
return inner_fun
# 使用装饰器
@outter_wrapper
def func():
被修饰函数函数体
示例:日志记录装饰器
def log_wrapper(fun):
def inner_fun(*args, **kwargs):
print("用户输入:", args)
rs = fun(*args, **kwargs)
print("系统返回结果:", rs)
return inner_fun
@log_wrapper
def login(username, pwd):
if username == 'zhangsan' and pwd == '123':
return True
return False
rs = login('zhangsan', '123')

2.带参装饰器
示例:
def valid_param(length):
def inner_wrapper(fun):
def inner_fun(*args, **kwargs):
print("验证数据有效性:")
username = kwargs.get("username")
pwd = kwargs.get("pwd")
if len(username) < length:
print("用户名长度不合法!(长度小于了{})".format(length))
return "Invalid"
if len(pwd) < length:
print("密码长度不合法!(长度小于了{})".format(length))
return "Invalid"
return "Valid"
return inner_fun
return inner_wrapper
@valid_param(4)
def login(username, pwd):
if username == 'zhangsan' and pwd == '123':
return True
return False
rs = login(username='zhangsan', pwd='123')
print(rs)

二、类装饰器
# 装饰器定义
def class_wrapper(cls):
class WrapperClass:
类体
return WrapperClass
# 使用装饰器
@valid_user_exist
class Class:
被修饰类类体
示例:
def valid_user_exist(cls):
class WrapperClass:
def __init__(self, username, pwd):
self.username = username
self.pwd = pwd
def register(self):
if self.username == 'zhangsan':
return "username existed!"
wrapper = cls(self.username, self.pwd)
wrapper.register()
return "registration success!"
return WrapperClass
@valid_user_exist
class User:
def __init__(self, username, pwd):
self.username = username
self.pwd = pwd
def register(self):
print(self.username + "注册成功~!")
print("**********************")
u1 = User('zhangsan', '1234')
rs1 = u1.register()
print(rs1)
print("**********************")
u2 = User('lisi', '1234')
rs2 = u2.register()
print(rs2)
print("**********************")

网友评论