当前位置: 首页 > 编程日记 > 正文

Python3中装饰器介绍

      Python中的装饰器(decorator)是一个接受另一个函数作为参数的函数。装饰器通常会修改或增强它接受的函数并返回修改后的函数。这意味着当你调用一个装饰函数时,你会得到一个与基本定义相比可能有一些额外特性的函数。Python中的函数可以用作或作为参数传递。

      Python中的装饰器允许程序员修改函数或类的行为。装饰器允许我们包装一个函数以扩展此函数的行为而无需修改此函数。

      在Python中,装饰器以@符号开头,后跟我们将用来”装饰”的函数名称。要使用装饰器,你只需将它放在函数定义之前的行上。@符号是装饰器的语法糖

      装饰器不仅可以是函数,还可以是类。使用类装饰器主要依靠类的__call__方法。一个函数可以同时定义多个装饰器。

      Python自带几个内置装饰器:@classmethod;@staticmethod;@property

      Python中的函数属性:函数是Object类型的一个实例;你可以将函数存储在变量中;你可以将一个函数作为参数传递给另一个函数;你可以从一个函数内返回另一个函数;你可以将函数存储在哈希表、列表等数据结构中。

      以上内容及以下测试代码主要参考:

      https://python101.pythonlibrary.org/chapter25_decorators.html

      https://www.geeksforgeeks.org/decorators-in-python/

import functoolsvar = 8def another_function(func):""" A function that accepts another function """def other_func(): # 嵌套函数val = "The result of %s is %s" % (func(), eval(func()))return valreturn other_funcif var == 1:# reference: https://python101.pythonlibrary.org/chapter25_decorators.htmldef a_function():""" A pretty useless function """return "1+1"value = a_function()print(value)decorator = another_function(a_function)print(decorator())
elif var == 2:# 对以上示例做些修改,加入装饰器 https://python101.pythonlibrary.org/chapter25_decorators.html@another_function # 这里的@称为语法糖def a_function():""" A pretty useless function """return "1+1"value = a_function()print(value)
elif var == 3:# reference: https://python101.pythonlibrary.org/chapter25_decorators.htmlclass DecoratorTest(object):""" Test regular method vs @classmethod vs @staticmethod """def __init__(self):""" Constructor """passdef doubler(self, x):""""""print("running doubler")return x*2@classmethod # 可以使用类的实例或直接由类本身作为其第一个参数来调用def class_tripler(klass, x):""""""print("running tripler: %s" % klass)return x*3@staticmethod # 类中的一个函数,可以在实例化类或不实例化类的情况下调用它def static_quad(x):""""""print("running quad")return x*4decor = DecoratorTest()print(decor.doubler(5))print(decor.class_tripler(3))print(DecoratorTest.class_tripler(3))print(DecoratorTest.static_quad(2))print(decor.static_quad(3))print(decor.doubler)print(decor.class_tripler)print(decor.static_quad)
elif var == 4:# https://python101.pythonlibrary.org/chapter25_decorators.htmlclass Person(object):def __init__(self, first_name, last_name):"""Constructor"""self.first_name = first_nameself.last_name = last_name@property # 将类方法转换为属性def full_name(self):""" Return the full name """return "%s %s" % (self.first_name, self.last_name)person = Person("Mike", "Driscoll")print(person.full_name) # 注意: person.full_name与person.full_name()区别print(person.first_name)#person.full_name = "Jackalope" # AttributeError: can't set attribute, 不能将属性设置为不同的值,只能间接进行person.first_name = "Dan"print(person.full_name)
elif var == 5:# reference: https://www.geeksforgeeks.org/decorators-in-python/def shout(text):return text.upper()yell = shout # assign the function shout to a variableprint(yell('Hello'))def greet(func): # greet function takes another function as a parametergreeting = func("""Hi, I am created by a function passed as an argument.""") # storing the function in a variableprint (greeting)greet(shout)def create_adder(x):def adder(y):return x+yreturn adder # function can return another functionadd_15 = create_adder(15)print(add_15(10))
elif var == 6:# reference: https://www.geeksforgeeks.org/decorators-in-python/def hello_decorator(func): # defining a decorator# inner is a Wrapper function in which the argument is called# inner function can access the outer local functions like in this case "func"@functools.wraps(func) # 内置装饰器@functools.wraps会保留原函数的元信息,将元信息拷贝到装饰器里面的func函数中def inner():print("Hello, this is before function execution:", func.__name__) # 函数对象的__name__属性,可以拿到函数的名字func() # calling the actual function now inside the wrapper function.print("This is after function execution")return inner# defining a function, to be called inside wrapperdef function_to_be_used():print("This is inside the function !!")print("decorator before, function name:", function_to_be_used.__name__)function_to_be_used() # 装饰器前# passing 'function_to_be_used' inside the decorator to control its behaviorfunction_to_be_used = hello_decorator(function_to_be_used)# 注意:如果上面inner函数定义前不加@functools.wraps,下面的print将输出inner,添加后会输出function_to_be_usedprint("decorator after, function name:", function_to_be_used.__name__)function_to_be_used() # 装饰器后# above code is equivalent toprint("==========================")@hello_decoratordef function_to_be_used2():print("This is inside the function !!")function_to_be_used2()
elif var == 7:# reference: https://www.geeksforgeeks.org/decorators-in-python/def hello_decorator(func):# The inner function takes the argument as *args and **kwargs which means# that a tuple of positional arguments or a dictionary of keyword arguments can be passed of any length# This makes it a general decorator that can decorate a function having any number of arguments@functools.wraps(func)def inner(*args, **kwargs): # *args表示所有的位置参数,**kwargs表示所有的关键字参数.之后再将其传到func函数中,这样保证了能完全传递所有参数print("before Execution")print("call function:", func.__name__)returned_value = func(*args, **kwargs) # getting the returned valueprint("after Execution")return returned_value # returning the value to the original framereturn inner# adding decorator to the function@hello_decoratordef sum_two_numbers(a, b):print("Inside the function")return a + ba, b = 1, 2# getting the value through return of the functionprint("Sum =", sum_two_numbers(a, b))
elif var == 8:class decorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print("function name:", self.func.__name__)return self.func(*args, **kwargs)@decoratordef add(a, b):print("add value:", a+b)add(2, 3)print("test finish")

GitHub:https://github.com/fengbingchun/Python_Test

相关文章:

Java数据访问对象模式

数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。 数据访问对象接口(Data Access Object Interface) - 该接口定义了在一…

hdoj 5199 Gunner map

Gunner Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid5199 Description Long long ago, there is a gunner whose name is Jack. He likes to go hunting very much. One day he go to the grove. There are n birds and n tr…

Python3中上下文管理器介绍

在任何编程语言中,文件操作或数据库连接等资源的使用都很常见。但这些资源供应有限。因此,主要问题在于确保在使用后释放这些资源。如果不释放它们,则会导致资源泄漏,并可能导致系统变慢或崩溃。如果用户有一个自动设置和拆卸资源…

LatentFusion:华盛顿大学与英伟达联合提出6D姿态估计新方法

作者 | Keunhong Park、Arsalan Mousavian、Yu Xiang、Dieter Fox 译者 | 刘畅 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 【导读】在本文中,华盛顿大学和英伟达联合提出了一种新的用于未见过目标 6D姿态估计的框架。作…

Java前端控制器模式

前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种…

提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成

2019独角兽企业重金招聘Python工程师标准>>> 之前写了一些关于代码生成的文章,提供了两种不同方式的代码生成解决方案,即CodeDOMCustom Tool和T4。对于ASP.NET应用,你还有第三种选择——自定义BuildProvider。[文中涉及的源代码从…

Java拦截过滤器模式

拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请…

1200亿次日均位置服务响应、20亿公里日均轨迹里程,百度地图发布新一代人工智能地图生态全景

12月10日,百度地图首次公布了“新一代人工智能地图”生态全景。目前,百度地图日均位置服务请求次数突破1200亿次,日均轨迹里程20亿公里,注册开发者数量达180万,服务超过50万个移动应用。 百度地图事业部总经理李莹称&…

Python3中global/nonlocal用法

全局变量(global variable)是那些未在任何函数内部定义并且具有全局作用域的变量,而局部变量(local variable)是那些在函数内部定义并且其作用域仅限于该函数的变量。换句话说,我们可以说局部变量只能在初始化它的函数内部访问,而全局变量在整…

客户端动态调用WCF服务中的方法

首先要写一个执行动态调用的方法&#xff1a;在里面实现反射调用。 public static object ExecuteMethod<T>(string pUrl,string pMethodName, params object[] pParams) { EndpointAddress address new EndpointAddress(pUrl); Binding bindinginstance null; NetTcpB…

Python3中闭包介绍

Python3中的闭包(closure)是一个函数对象&#xff0c;它记住封闭作用域(enclosing function)中的值&#xff0c;即使它们不存在于内存中。它是一个将函数与环境一起存储的记录。由于闭包用作回调函数&#xff0c;因此它们提供了某种数据隐藏&#xff0c;这有助于我们减少使用全…

Java服务定位器模式

服务定位器模式&#xff08;Service Locator Pattern&#xff09;用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高&#xff0c;服务定位器模式充分利用了缓存技术。在首次请求某个服务时&#xff0c;服务定位器在 JNDI 中查找服务&#xff…

用AI加速物联网落地,安富利的客户洞察和解决之道

作为一家全球IT解决方案分销商&#xff0c;成立于1921年的安富利也紧随AI浪潮&#xff0c;为区域和全球的终端客户提供AI解决方案。据了解&#xff0c;安富利已为全球超过1400家企业提供技术支持&#xff0c;电子产品年度出货量达1220亿片。 近日在媒体沟通会上&#xff0c;安富…

Linux运维工程师发展前景

随着IT产业的不断发展&#xff0c;尤其是Linux行业的发展&#xff0c;现在互联网企业服务器数量越来越多&#xff0c;当到达几百台&#xff0c;上千台服务器之后&#xff0c;服务器日常管理也逐渐繁杂&#xff0c;每天如果通过人工去频繁的更新或者部署及管理这些服务器&#x…

Python3中__init__.py文件介绍

Python中的模块是包含Python定义和语句的文件(A module is a file containing Python definitions and statements)&#xff0c;其文件名是模块名加后缀名.py。在模块内部&#xff0c;通过全局变量__name__可以获取模块名。 模块包含可执行语句及函数定义。这些语句用于初始化模…

赠书 | 熵的实际应用,赌场和金融圈最著名的一个数学公式

本文选自湛庐文化策划出版图书《模型思维》。作者斯科特佩奇&#xff0c;超过100万用户的“模型思维课”主讲人。密歇根大学复杂性研究中心“掌门人”。圣塔菲研究所外聘研究员。曾出版《多样性红利》一书。斯科特佩奇以对社会科学多样性和复杂性的研究和建模面闻名。具体研究方…

Java传输对象模式

传输对象模式&#xff08;Transfer Object Pattern&#xff09;用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类&#xff0c;它是可序列化的&#xff0c;所以它可以通过网络传输。它没有…

图片下方出现几像素的空白间隙

1、如何定义高度很小的容器&#xff1f; 在IE6下无法定义小高度的容器&#xff0c;是因为有一个默认的行高。 列举2种解决方案&#xff1a;overflow:hidden | line-height:0 2、图片下方出现几像素的空白间隙&#xff1f; 这个也有多种解决方案&#xff0c;如将img定义为displa…

Python3中Pillow(PIL)介绍

PIL全称为Python Imaging Library&#xff0c;是Python中的免费开源图像处理库。PIL的最新版本为1.1.7&#xff0c;于2009年9月发布&#xff0c;支持Python的最高版本到2.7。原始的PIL开发于2011年停止。随后&#xff0c;一个名为Pillow的后续项目fork了PIL的repository并增加了…

GitHub有望在中国开设子公司?

作者 | Financial Times译者 | 弯月&#xff0c;编辑 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;作为世界上最大的软件开发平台&#xff0c;GitHub 自去年被微软以 75 亿美元收购后&#xff0c;一直颇受外界的争议。虽然在交易完成后&#xff0c;GitHub…

OC指示符assign、atomic、nonatomic、copy、retain、strong、week的解释

在使用property定义property时可以在property与类型之间用括号添加一些额外的指示符&#xff0c;常用的指示符有assign、atomic、nonatomic、copy、retain、strong、week、等。详情如下&#xff1a; assign&#xff1a; 简单赋值&#xff0c;不更改索引计数&#xff08;Referen…

项目沟通管理计划

沟通计划包括决定项目涉及人的信息和沟通需求&#xff1a;谁需要什么信息&#xff1b;什么时候需要&#xff1b;怎么获得。虽然所有的项目都需要沟通项目信息&#xff0c;但信息需求和传播方式差别很大。确认涉及人的信息需求和决定满足需求的适当方式是项目获得成功的重要因素…

PyTorch中torchvision介绍

TorchVision包包含流行的数据集、模型架构和用于计算机视觉的图像转换&#xff0c;它是PyTorch项目的一部分。TorchVison最新发布版本为v0.11.1&#xff0c;发布较频繁&#xff0c;它的license为BSD-3-Clause。它的源码位于&#xff1a; https://github.com/pytorch/vision T…

百度ERNIE登顶GLUE榜单,得分首破90大关

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;12月10日&#xff0c;百度ERNIE在自然语言处理领域权威数据集GLUE中登顶榜首&#xff0c;以9个任务平均得分首次突破90大关刷新该榜单历史&#xff0c;其表现超越微软MT-DNN-SMART, 谷歌T5、ALBERT等一众顶级预训练模…

Java 重写(Override)与重载(Overload)

TestDog.java /* * 重写(Override) * 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; * 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现…

Oracle常用查看表结构命令

2019独角兽企业重金招聘Python工程师标准>>> select user from dual; //查看当前的用户名 select table_name from all_tables; //所有用户的表 select table_name from dba_tables; //包括系统表 select table_name from dba_tables where owner用户名 user_tabl…

TorchVision中使用FasterRCNN+ResNet50+FPN进行目标检测

TorchVision中给出了使用ResNet-50-FPN主干(backbone)构建Faster R-CNN的pretrained模型&#xff0c;模型存放位置为https://download.pytorch.org/models/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth&#xff0c;可通过fasterrcnn_resnet50_fpn函数下载&#xff0c;此函数实现…

iOS-UIButton防止重复点击(三种办法)

目录 使用场景方法一 设置enabled或userInteractionEnabled属性方法二 借助cancelPreviousPerformRequestsWithTarget:selector:object实现方法三 通过runtime交换方法实现注意事项一 使用场景 在实际应用场景中&#xff0c;有几个业务场景需要控制UIButton响应事件的时间间隔。…

华为诺亚方舟开源预训练模型“哪吒”,4项任务均达到SOTA

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;BERT之后&#xff0c;新的预训练语言模型XLnet、RoBERTa、ERNIE不断推出&#xff0c;这次&#xff0c;华为诺亚方舟实验室开源了基于BERT的中文预训练语言模型NEZHA&#xff08;哪吒&#xff09;&#xff0c;寓意模型能…

音量调节助手(转)

源&#xff1a;音量调节助手 软件名称&#xff1a;音量调节助手 软件功能&#xff1a;通过键盘快捷键快速调节系统主音量 软件版本&#xff1a;V2014 软件作者&#xff1a;易几网络 操作系统&#xff1a;所有WINDOWS版本 开发工具&#xff1a;DELPHI XE …