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'))

装饰器中增加参数


我的目标是每天厉害一点点
原文地址:https://www.cnblogs.com/sidaofeng/p/10179067.html