本章主要学习,python的装饰方法,你可以认为就是方法切面,就是执行目标方法之前或之后都可以执行其他函数。
1、locals()
def func():
return 1
print(func())
s = 'Global Variable'
def check_for_locals():
a = 1
b = 2
print(locals())
2、globals()
print(globals())
print(globals().keys())
check_for_locals()
3、函数引用
- 不带() 表示函数引用,加上()表示调用该方法
- 删除,函数引用可以删除,del 函数引用,但是这个删除不会影响到,原来赋值函数引用变量引用,说明本质方法没有删除。
def hello(name = 'Jose'):
return 'Hello ' +name
print(hello())
greet = hello
print(greet)
print(greet())
hello()
greet()
4、函数嵌入函数
- 函数中还可以嵌入函数
- 既然我可以获得函数引用,我们是不是可以根据不同情况返回不同函数引用,执行不同方法调用呢, 是不是实现方法的多态,不需要在类上完成这个功能
def hello(name='Jose'):
print('The hello() function has been executed')
def greet():
return '\t this is inside the greet() function'
def welcome():
return '\t This is inside the welcome() function'
print(greet())
print(welcome())
print('Now we are back inside the hello() function')
hello()
def hello(name='Jose'):
def greet():
return '\t This is inside the greet() function'
def welcome():
return "\t This is inside the welcome() function"
if name == 'Jose':
return greet
else:
return welcome
x = hello()
print(x())
5、函数引用可以作为函数入参
- 这样很容易实现装饰模式,在执行真正的方法之前做一些前置操作
def hello():
return 'Hi Jose!'
def other(func):
print("Other code would go here")
print(func())
other(hello)
def new_decorator(func):
def wrap_func():
print("Code would be here, before executing the func")
func()
print("Code here will execute after the func()")
return wrap_func
def func_needs_decorator():
print("This function s in need of a Decorator")
func_needs_decorator()
func_needs_decorator = new_decorator(func_needs_decorator)
func_needs_decorator()
@new_decorator
def func_needs_decorator():
print("This function is in need of a Decorator")
func_needs_decorator()
总结
- locals() 和 globals()返回都是dictionary格式
- 方法名不带() 表示函数引用,加上()表示调用该方法
- 函数可以组装,也就是数学列函数一样
- 支持动态装饰的注解,@函数名
参考文档
- https://github.com/Pierian-Data/Complete-Python-3-Bootcamp.git
|