Python的装饰器,python装饰器--原来如此简单

  Python的装饰器,python装饰器--原来如此简单

  本文主要详细介绍python decorator代码。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。

  装饰器通用模型

  定义包装(fn):

  def inner(*args,**kwargs):

  ret=fn(*args,**kwargs)

  返回ret

  返回内部

  装饰器几个关键点

  1.函数可以作为参数传递。

  2.该函数可以作为返回值返回。

  3.函数名可以被赋值为变量。

  Decorator本质上是一个闭包。

  在不改变原始函数调用的情况下,向函数中添加新函数。

  举个例子

  #!/usr/bin/python

  国防行政(游戏):

  Def inner (* args,* * kwargs) : # inner添加了参数,args必须是元组kwargs必须是字典

  打印(“开放工作组”)

  Result=game (* args,* * kwargs) # * *表示args元组和kwargs分散成位置参数,传入关键字参数。

  打印(“关闭工作组”)

  回送结果

  返回内部

  @admin

  def play_dnf(用户名,密码):

  打印(f 开始玩DNF,账号: {用户名},密码3360 {密码} )

  印刷(“刀割肉,心割魂”)

  还‘掉:元的哭炮’

  @admin

  def play_wow(种族,职业,服务器_名称,阵营):

  打印(f 开始玩魔兽世界,种族:{race},职业3360 {occupation},服务器3360 {server _ name},营地3360 {camp} )

  印刷品(“为了辛多雷的荣耀”)

  返回掉了:的灰烬使者

  if __name__==__main__:

  Ret1=play_dnf(大马猴, 88888 )

  打印(返回1)

  Ret2=play_wow(血精灵,圣骑士,回声山,部落)

  打印(返回2)

  这段代码很好理解,我就不解释了,然后是执行结果。

  python demo.py

  开放工作组

  开始玩DNF,账号:密码:88888。

  刀割肉,心割魂。

  关闭工作组

  滴:屠杀法哼哼唧唧的枪。

  开放工作组

  开始玩魔兽世界,种族:血精灵,职业:圣骑士,服务器:回声山,营地:部落。

  为了辛多雷的荣耀

  关闭工作组

  掉落:灰烬使者

  进程结束,退出代码为0

  一个函数被多个装饰器装饰,又将如何执行呢?

  #!/usr/bin/python

  定义包装器1(fn):

  def inner(*args,**kwargs):

  打印(“这是w1条目”)

  ret=fn(*args,**kwargs)

  打印(“这是w1输出”)

  返回ret

  返回内部

  定义包装器2(fn):

  def inner(*args,**kwargs):

  打印(“这是w2条目”)

  ret=fn(*args,**kwargs)

  打印(“这是w2输出”)

  返回ret

  返回内部

  @wrapper1

  @wrapper2

  定义目标():

  打印(“我是目标”)

  if __name__==__main__:

  目标()

  直接给出执行顺序

  由多个装饰者装饰的函数的执行顺序。

  # w1 w2目标w2 w1

  带参数的装饰器

  装饰器的语法允许我们在调用时提供其他参数,比如@decorator(a)。这样就为decorators的编写和使用提供了更多的灵活性。

  (上面设置了另一层功能)

  例如,我们可以在装饰器中指定日志级别,因为不同的业务功能可能需要不同的日志级别。

  定义使用记录(级别):

  定义装饰器(功能):

  def包装(*args,**kwargs):

  如果level==warn:

  logging.warn(%s正在运行 % func。__name__)

  elif级别==info:

  logging.info(%s正在运行 % func。__name__)

  返回函数(*参数)

  返回包装

  返回装饰者

  @use_logging(level=warn )

  def foo(name=foo):

  打印(“我是% s“% name”)

  foo()

  类装饰器

  没错,decorator不仅可以是函数,也可以是类。与函数装饰器相比,类装饰器具有很大的灵活性、高内聚性和封装性。使用类装饰器主要依赖于类的__call__方法,当装饰器使用@ form附加到一个函数时调用该方法。

  类Foo(对象):

  def __init__(self,func):

  自我。_func=func

  def __call__(self):

  打印(“类装饰器运行”)

  自我。_func()

  打印(“类装饰结束”)

  @Foo

  定义栏():

  打印(“条形”)

  酒吧()

  

总结

  本文到此为止。希望能帮到你,也希望你能多关注更多热门IT软件开发工作室的内容!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: