装饰器

news/2024/10/14 20:02:22

Java注解和python装饰器

java注解:

  • 都是@开头,注解、装饰器都可以自定义、都可以带参数、都可以被标注代码块之前执行

  • Java 注解也叫元数据,一种代码级别的说明。注解是给别人看的,功能不仅仅由注解决定

  • 注解对元数据进行了检查、对比等工作,不会对所修饰的代码产生直接的影响

  • java注解可以写在类、方法、变量头上

  • 使用注解(Annotation)的语言:AtScript、Java、C#(叫 Attribute)

python装饰器:

  • 都是@开头,注解、装饰器都可以自定义、都可以带参数、都可以被标注代码块之前执行

  • Python 装饰器是一种语法糖。装饰器直接拦截,直接改变被装饰对象的行为

  • 装饰器可以对方法进行功能上的改变,可以对所修饰的代码产生直接的影响。

  • python装饰器可以写在类、方法头上。

  • 使用装饰器(Decorator)的语言:Python、JavaScript/ECMAScript

在java中注解+反射能够实现和python里装饰器同样的效果。

 

装饰器基础概念

装饰器本质上是一个函数,它可以接收一个函数作为参数并返回一个新的函数。这个新函数是对原函数的一种包装或增强,可以在不改变原函数代码的前提下,增加额外的功能。

装饰器的返回值也是一个函数。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

Python中的装饰器是一个语法糖,它本身就涉及到一个返回函数的概念,可以说返回函数是装饰器得以实现的基石。

由于Python有一个内建属性__call__,这个是一个很神奇的特性,只要某个类型中有__call__方法,我们可以把这个类型的对象当作函数来使用。这点是JavaC++不一样的地方,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数

装饰器实现

装饰器的实现程可以分为以下几个步骤:

  1. 定义装饰器:首先定义一个装饰器函数,该函数接收一个函数作为参数。

  2. 定义包装函数:在装饰器函数内部,定义一个包装函数(wrapper),这个包装函数会调用原函数,并可以在调用前后添加额外的逻辑。

  3. 返回包装函数:装饰器函数返回这个包装函数。

  4. 使用@语法:在需要被装饰的函数定义前使用@符号加上装饰器名称,这样Python解释器会自动将这个函数作为参数传递给装饰器,并将返回的新函数(包装函数)赋值给原函数名。

说白了装饰器就是一个闭包函数。

def deco(func):
   def _deco():
       print("before myfunc() called.")
       # 执行被装饰的函数
       func()
       print(" after myfunc() called.")
       # 不需要返回func,实际上应返回原函数的返回值
   return _deco

@deco
def myfunc():
   print(" myfunc() called.")

myfunc()

示例:

1、装饰器装饰的函数有多个参数

def deco(func):
   # 内部参数需要定义 不定数量的位置参数和关键字参数,以接受和传递任意数量的参数
   def _deco(*args, **kwargs):
       print("before %s called." % func.__name__)
       # 执行被装饰的函数,使用不定参数
       ret = func(*args, **kwargs)
       print(" after %s called. result: %s" % (func.__name__, ret))
       return ret
   return _deco

@deco
def myfunc(a, b, c):
   print(" myfunc(%s,%s,%s) called." % (a, b, c))
   return a+b+c

myfunc(1, 2, 3)

2、装饰器带参数:装饰器带参数,则装饰器函数则变成了三层,我们需要在最外层把装饰器的参数传递进去。

# 第一层传入装饰器参数
def deco(arg):
   # 第二层传入被装饰函数
   def _deco(func):
       # 第三层进行逻辑处理
       def __deco():
           print("before %s called [%s]." % (func.__name__, arg))
           func()
           print(" after %s called [%s]." % (func.__name__, arg))
       return __deco
   return _deco

@deco("mymodule")
def myfunc():
   print(" myfunc() called.")
 
myfunc()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

程序员必看!从菜鸟到专家你要这么做,8年互联网老兵爆肝总结

“互联网行业工作8年多,在国内Top互联网大厂B(ytedance)AT中的两家待过。喜欢研究计算机基础原理,有移动端全栈(包括Android & iOS & 鸿蒙等)开发经验,对逆向和网络安全有一定经验。” 不管是在校大学生,还是初入职场的菜鸟,抑或是在互联网行业打拼多年的老码农…

CTF 的基础知识 题型 Trick总结

idk.references: 1 2 web php 语法基础 references: 1 php 脚本的基本格式: <?php //coding here ?>php 代码同样以 ; 结尾。 php 文件的后缀名大多是 php ,也有诸如 php5 php4 phps 之类,如果普通的后缀名被拦截不妨试试其他的。 php 变量用 $ 来定义,大小写敏感…

微服务03 微服务sentinel, springcloudgateway

6 Sentinel 6.1 Sentinel 介绍和工作机制 6.1.1 微服务流量治理组件介绍 随着微服务的流行,服务和服务之间的调用导致服务的稳定性问题变得越来越重要。 雪崩问题: 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,即雪崩。 解决雪崩问题的常见方式有…

Web刷题之polarctf靶场(3)

1. 干正则 打开靶场发现是简单的php代码审计, 先构造id=a[0]=www.polarctf.com, 由于要ping两次, 所以先构造cmd=|ls <?php error_reporting(0); if (empty($_GET[id])) {show_source(__FILE__);die(); } else {include flag.php;$a = "www.baidu.com";$result =…

题解:P2315 [HNOI2005] 数三角形

Problem Link [HNOI2005] 数三角形 题意 输入一个大三角形的各个边存在情况,输出里面有多少个正三角形。 Solution 简单暴力即可,用 \(4\) 个数组维护每条边能延伸的最大长度,然后逐个判断三角形是否可行即可。如图,l_upper 维护左端点向上(即 $\ell_{BA} $),l_lower 维…

梳理好本职工作之项目管理

项目整个里程碑,每个阶段应该输出什么

微服务01 ZooKeeper, Kafka

1.4 微服务 1.4.6 Spring Cloud JAVA 微服务技术 Dubbo是2014年之前阿里退出的分布式系统的技术(不属于微服务)。现在主流是 Spring Cloud Spring Cloud官网地址: https://spring.io/projects/spring-cloud 官网上实现方法有很多种,目前主流是阿里巴巴实现的方法Spring Boot…

Swarm 框架登场:OpenAI 第 3 阶段「敲门砖」;马斯克的 Teslabot 实际有人远程操控丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…