装饰器

Posted shuai61457

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

引用:

1.不是在函数中使用,可以通过sys.getrefcount(a)引用个数
2.函数的引用:
必须要分清楚传递的值是可变类型还是不可变类型
如果
全局变量于局部变量:
# def test(n1): # n1=n=9 n1是局部变量,n是全局变量,所以n1+=1丝毫不会改变全局n的值
# # n1是局部变量
# n2 = 100
# for i in range(n1):
# print(\'----->\', i)
# # n1 += 1
# # print(n1) # 此时的n1是10
# n = 9 # 9是全局的
# test(n)
# print(n)
函数里的可变与不可变类型:
# list1 = [1, 2, 3, 45, 6]


# def test1(l): # l=list1 # 容器里添加值不会改变地址
# if isinstance(l, list):
# for i in l:
# print(\'----->\', i)
# l.insert(0, 8) # 往l里添加值也相当于往list1里添加值
# else:
# print(\'不是列表类型!!\')
# test1(list1)
# print(list1) # 因为列表是可变类型,所以往list1里添加值不会改变内存地址,反而加了值


# def outer():
# a = 100
#
# def inner():
# b = 200
# # b+=a # 内部函数可以使用外部函数的变量
# nonlocal a # 如果想修改外部函数的变量,则需要在内部添加:nonloca
# a += b # 内部函数不能修改外部函数的变量
# print(\'这是内部函数\', b)
#
# result = locals() # locals()表示查看函数中的局部变量,以字典的形式返回
# print(result)
# print(a)
# inner()
# outer()

闭包:
1,嵌套函数
2.内部函数引用了外部的变量
3,返回值是内部函数
全局:
全局变量是是不可变类型,必须添加global关键字,全局变量是可变类型无需添加
4,查看全局时用globals():是一个字典,分成1.字典2.自定义
# def outer(n):
# a = 10
#
# def inner():
# b = a + n # a
# print(\'内部函数\', b)
#
# return inner # 把inner扔出去然后r接收inner
#
#
# r = outer(5) # 5传值给n,n跟5只想同一个内存地址
# print(r) # 此时的取得是r的内存地址
# r() # 值为15
装饰器:

def decorater(func): # func=house house给func传值
print(\'------>1\')

def wrapper(): # wrapper是因为函数调用func内的值才调用wrapper
func() # 这是调用func所以相当与调用house所以先显示毛坯房
print(\'刷漆\')
print(\'装修\')
print(\'华丽的房子\')

print(\'-------->2\')
return wrapper # 把wrapper扔出去然后house接收wrapper

@decorater # decorater(house)相当于
def house():
print(\'毛坯房\')

house() # 相当与house=wepper 表面是调用house其实内存里调用的是wepper 内部里的内存地址也改变了


def decorater(func):
print(\'------>1\')
# 因为装饰器一般可以装饰多个函数,所以就用到*args,**kwargs,
def wrapper(*args,**kwargs): # 此时zhe时接收到的是一个整体的元组或自字典
r=func(*args,*kwargs) #所以这里要拆散
print(r)
print(\'刷漆\')
print(\'装修\')
print(\'华丽的房子\')
return r
print(\'-------->2\')
return wrapper

@decorater
def house():
print(\'毛坯房\')
house()

@decorater
def houtel(one,many):
print(\'酒店的面积是,每间房的面积是\'.format(one,many))
return 5000 # 调用函数有返回值,那么装饰器内部函数也要带返回值
r=houtel(1000,100)

 


 

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器:装饰器实例类装饰器(装饰函数)

装饰器、装饰器类与类装饰器(三)

Python进阶装饰器(Decorator)

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例内置装饰器

TS之装饰器