装饰器介绍:
#!/usr/bin/env python # -*- coding:utf-8 -*- # 装饰器一般用于不修改底层方法的情况下增加功能,例如网站登录,页面跳转的权限管理 def outer(func): def inner(): print("start") print("start") r = func() print("end") print("end") return r return inner @outer def f1(): print("F1") def f2(): print("F2") def f3(): print("F3") # 加了@之后 # 1.执行outer函数,并且将其下面的函数名[f1]当作参数 # 2.将outer的返回值重新赋值给 f1, f1 = outer()的返回值inner ret = f1() print(ret) # 小实例分析装饰器 def dec(func): # def inner(): # print("1111111") # ret = func() # print("2222222") # return ret # return inner return "guolei" @dec def index(): print("代码代码代码代码") return True print(index) # 只要函数应用装饰器,那么函数将被重新定义,重新定义为:装饰器的内层函数(返回值) print(type(index)) # 带参数的装饰器,内层函数也要增加参数,使用动态参数完美解决 # 一个函数可以应用多个装饰器 def outer1(func): def inner(*args, **kwargs): # print(args) # print(kwargs) print("123") ret = func(*args, **kwargs) print("456") return ret return inner def outer2(func): def inner(*args, **kwargs): print("3.5") ret = func(*args, **kwargs) print("4.5") return ret return inner # 多个装饰器, outer1先装饰index, outer2再装饰outer1 # index ==> outer2 里面的inner # outer2 inner2里面的func == > outer1 里面的inner # outer2 inner1里面的func == > 原始的index函数 @outer2 @outer1 def index(a1, a2): print("非常复杂") return a1 + a2 @outer1 def f1(a1): print("非常复杂") return a1 @outer1 def f2(a1, a2, a3): print("非常复杂") return a1 + a2 + a3 print(index(1, 5))
反射介绍:
#!/usr/bin/env python # -*- coding:utf-8 -*- # 反射 : 以字符串的形式去对象中操作成员 # getattr() 通过字符串的形式,导入模块,寻找变量、函数等 import commons target_func = getattr(commons, "NAME", None) print(target_func) # hasattr() 判断模块中是否有变量、函数等 # r = hasattr(commons, "name") # print(r) # setattr() 在模块中设置变量、函数 setattr(commons, "AGE", 18) # r = hasattr(commons, "AGE") # print(r) print(commons.AGE) # delattr() 在模块中删除变量、函数 delattr(commons, "AGE") r = hasattr(commons, "AGE") print(r) # 通过反射引入多级目录的模块 # from lib.test import com r = __import__("lib.test.com",fromlist=True) print(r) print(r.f10())