首页 > 其他分享 >装饰器

装饰器

时间:2023-03-14 09:56:17浏览次数:26  
标签:函数 house wrapper print n1 装饰 def

引用:

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)

 


 

标签:函数,house,wrapper,print,n1,装饰,def
From: https://www.cnblogs.com/shuai61457/p/17213854.html

相关文章

  • js装饰器作用
    JavaScript装饰器(Decorator)是一种语法特性,可以用于修改类和类的属性或方法。它是ES2017引入的新特性,在Vue3和Angular等现代框架中广泛使用。装饰器可以让我们在不......
  • [设计模式]设计模式之装饰器模式/包装模式【8】【待完善】
    1概述当你在编写代码时,需要扩展一个类的功能,或者是当前类的接口不能满足需求时,你会选择怎么做?重新编写子类,通过继承加入功能?修改原有类的接口使其符合现有环境?但你......
  • 装饰器
    #开放封闭原则:对修改封闭,对扩展开放装饰器的核心思想:在不改变被装饰对象的内部代码和原有调用方式的基础上在添加额外的功能装饰器他人的器具,本身可以是任意可调用对象,......
  • Python 内置函数装饰器 classmethod staticmethod
    使用官方的说法:classmethod(function)中文说明:classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法,使用方法如下:classC:@classmetho......
  • 单例模式应用于login-加装饰器
     importrandomdefsingleton(class_):instances={}defget_instance(*args,**kwargs):ifclass_notininstances:instances[cl......
  • .NET7依赖注入 装饰器模式
    ##.NET7依赖注入装饰器模式装饰器(Decorator)模式是一种在不改变原始类的情况下增强其功能的模式。在DI中,装饰器模式常用于在不改变原始服务的实现的情况下增强其功能,例......
  • Spring Boot 实现装饰器模式,真香!
    前言本文配合实战案例介绍我们平时在springboot项目里面怎么去用装饰器模式、多层装饰怎么玩。首先先说下装饰器模式是什么装饰器模式(DecoratorPattern)也称为包装......
  • python装饰器
    装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插......
  • 装饰模式
    概述《设计模式》一书中对于“装饰模式”的动机描述如下:动态地给一个对象添加一些额外的职责按照SOLID面向对象编程原则中的O(开闭原则),对于功能的修改应当关闭,而......
  • 装饰器(重点)
    一、装饰器介绍1.1为何要用装饰器软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适......