python--装饰器
# 开放屏蔽原则
# 对某些东西是开放的,对某些东西是屏蔽的
# 一般情况下是不允许在代码里边进行修改的。
# 一般是在外部进行开放的,只能在外部进行修改。
def outer(func): # func = f1
def inner():
print("hello")
print("hello")
print("hello")
r = func() # r = None
print("end")
print("end")
print("end")
return r
return inner # 返回inner的值 f1 就等于 inner 的内存地址
@outer # f1 = outer(f1)
def f1():
print("F1")
f1()
# 装饰器的原理
# 使用装饰器,将原函数封装到新函数里面,执行原来的函数,并执行新的函数
# @ 符号有特殊性
# @outer
# 1、执行@后面的 outer 函数,并且将其下面的 f1 函数名(不加括号),当做参数传递进去
# 2、将outer的返回值重新赋值给 f1,f1 = outer 的返回值
# f1()就是新的f1函数,= inner
######################## 林hf
# 装饰器,用来装饰函数,可以让函数执行之前或执行之后做一些操作
# 装饰器本质:是函数,功能:装饰其他函数(就是为其他函数添加附加功能)
# 原则:
# 1、不能修改被装饰的函数的源代码
# 2、不能修改被装饰的函数的调用方式
# 1、新增一个功能,不能够修改一个函数的源代码,函数一旦写好了,原则上就不能修改源代码
"""
装饰器知识储备:
1、函数即"变量"
2、高阶函数
满足以下条件之一就可以
a、把一个函数名当做实参传给另个一个参数(在不修改被装饰函数源代码的情况下为其添加功能)
b、返回值中包含函数名(不修改函数的调用方式)
3、嵌套函数
a、在一个函数体内,用def去定义一个函数,叫嵌套
高阶函数 + 嵌套函数 = 》 装饰器
"""
# 开放屏蔽原则
# 对某些东西是开放的,对某些东西是屏蔽的
# 一般情况下是不允许在代码里边进行修改的。
# 一般是在外部进行开放的,只能在外部进行修改。
"""
def outer(func): # func = f1
def inner():
print("hello")
print("hello")
print("hello")
r = func() # r = None
print("end")
print("end")
print("end")
return r
return inner # 返回inner的值 f1 就等于 inner 的内存地址
@outer
def f1():
print("F1")
f1()
"""
# @ 符号具有特殊性
# @outer
# 1、执行@后的outer函数,并且将其下面的函数名f1当作参数,传递进去 f1 == func
# 2、将outer的返回值,重新赋值给了f1, f1 == outer的返回值
# 3、执行f1() 时,就不会执行原来的f1函数了,而是执行新的返回值f1。
#
#
#
# def outer(func): # func 就等于原来的f1函数
# def inner():
# print("hello")
# print("hello")
# print("hello")
# r = func() # r = None
# print("end")
# print("end")
# print("end")
# return r
# return inner # outer的返回值 inner 就是一个内存地址,因为没有加(),将inner重新赋值给f1,现在的f1()就是:三括号里
"""
# def inner():
# print("hello")
# print("hello")
# print("hello")
# r = func() # 此时的func()就是原来的f1
# print("end")
# print("end")
# print("end")
# return r
"""
# def outer(func): # func = f1
# def inner():
# print("hello")
# print("hello")
# print("hello")
# r = func() # r = None
# print("end")
# print("end")
# print("end")
# return r
# return inner # 返回inner的值 f1 就等于 inner 的内存地址
#
#
# @outer
# def f1():
# print("F1")
#
#
# f1()
#
#
# @outer
# def f1():
# print("F1")
#
#
# f1()
#### 举例1: ####
def outer(func):
return "SB"
@outer
def index():
return True
print(index)
# SB
#### 举例3: ####
def outer(func):
def inner():
print('123')
return inner
@outer
def index():
return True
index()
# 123
#### 举例2: ####
def outer(func):
def inner():
print('123')
func()
print('456')
return inner
@outer
def index():
print('acb')
return True
index()
# 123
# abc
# 456
#### 加上参数的 装饰器。
#### 加参数 装饰器 举例1:####
def outer(func):
def inner(b1, b2):
ret = func(b1, b2) # 1、执行index(b1,b2)函数 2、并将返回值复制为ret
c1 = b1 - b2
print('我是inner 减', c1)
c2 = b1 * b2
print('我是inner 乘', c2)
c3 = b1 / b2
print('我是inner 除', c3)
return ret
return inner
@outer
def index(a1, a2):
print(a1,a2,'用第一个参数在前,第二个参数在后')
cc = a1 + a2
print('我是index 和', cc)
return True
index(10, 2)
# 只要函数应用装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数
#### 对应不确定参数的个数时候,怎么解决?
希望写一个装饰器,可以满足多个函数都可以应用上。不管是一个参数还是多个函数,还是任意个参数。
# ### 可以接受任意的参数 举例1; ####
def f1(*arg, **kwargs):
print(arg)
print(kwargs)
f1(1, 2, 3, 34, 4, k1=123)
# (1, 2, 3, 34, 4)
# {'k1': 123}
增加多个装饰器:
# 定义一个将小写转换为大写的程序
# 1、要将转换后的两边加上<p> xxx <\p>
# 2、新增需求,将<p>两边再加上<div>
def add_div(func):
def inner(aa):
return "<div>" + func(aa) + "</div>"
return inner
def add_p(func):
def inner(aa):
return "<p>" + func(aa) + "</p>"
return inner
@add_div
@add_p
def my_upper(text):
v = text.upper()
return v
print(my_upper('wo ai ni zhongguo'))
装饰器中增加参数
我的目标是每天厉害一点点