python函数装饰器用法实例详解
admin
2023-07-31 02:26:51
0

本文实例讲述了python函数装饰器用法。分享给大家供大家参考。具体如下:

装饰器经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,
有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

#! coding=utf-8 
import time 
def timeit(func): 
  def wrapper(a): 
    start = time.clock() 
    func(1,2) 
    end =time.clock() 
    print \'used:\', end - start 
    print a 
  return wrapper 
@timeit
# foo = timeit(foo)完全等价, 
# 使用之后,foo函数就变了,相当于是wrapper了 
def foo(a,b): 
  pass 
#不带参数的装饰器 
# wraper 将fn进行装饰,return wraper ,返回的wraper 就是装饰之后的fn 
def test(func): 
  def wraper(): 
    print \"test start\" 
    func() 
    print \"end start\" 
  return wraper 
@test 
def foo(): 
  print \"in foo\" 
foo() 

输出:

test start 
in foo 
end start 

装饰器修饰带参数的函数:

def parameter_test(func): 
  def wraper(a): 
    print \"test start\" 
    func(a) 
    print \"end start\" 
  return wraper 
@parameter_test 
def parameter_foo(a): 
  print \"parameter_foo:\"+a 
#parameter_foo(\'hello\') 

输出:

>>> 
test start 
parameter_foo:hello 
end start 

装饰器修饰不确定参数个数的函数:

def much_test(func): 
  def wraper(*args, **kwargs): 
    print \"test start\" 
    func(*args, **kwargs) 
    print \"end start\" 
  return wraper 
@much_test 
def much1(a): 
  print a 
@much_test 
def much2(a,b,c,d ): 
  print a,b,c,d 
much1(\'a\') 
much2(1,2,3,4) 

输出:

test start 
a 
end start 
test start 
1 2 3 4 
end start 

带参数的装饰器,再包一层就可以了:

def tp(name,age): 
  def much_test(func): 
    print \'in much_test\' 
    def wraper(*args, **kwargs): 
      print \"test start\" 
      print str(name),\'at:\'+str(age) 
      func(*args, **kwargs) 
      print \"end start\" 
    return wraper 
  return much_test 
@tp(\'one\',\'10\') 
def tpTest(parameter): 
  print parameter 
tpTest(\'python....\') 

输出:

in much_test 
test start 
one at:10 
python.... 
end start 

class locker: 
  def __init__(self): 
    print(\"locker.__init__() should be not called.\") 
  @staticmethod 
  def acquire(): 
    print(\"locker.acquire() called.(这是静态方法)\") 
  @staticmethod 
  def release(): 
    print(\"locker.release() called.(不需要对象实例\") 
def deco(cls): 
  \'\'\'cls 必须实现acquire和release静态方法\'\'\' 
  def _deco(func): 
    def __deco(): 
      print(\"before %s called [%s].\" % (func.__name__, cls)) 
      cls.acquire() 
      try: 
        return func() 
      finally: 
        cls.release() 
    return __deco 
  return _deco 
@deco(locker) 
def myfunc(): 
  print(\" myfunc() called.\") 
myfunc() 

输出:

>>> 
before myfunc called [__main__.locker].
locker.acquire() called.(这是静态方法)
 myfunc() called.
locker.release() called.(不需要对象实例
>>> 

class mylocker: 
  def __init__(self): 
    print(\"mylocker.__init__() called.\") 
  @staticmethod 
  def acquire(): 
    print(\"mylocker.acquire() called.\") 
  @staticmethod 
  def unlock(): 
    print(\" mylocker.unlock() called.\") 
class lockerex(mylocker): 
  @staticmethod 
  def acquire(): 
    print(\"lockerex.acquire() called.\") 
  @staticmethod 
  def unlock(): 
    print(\" lockerex.unlock() called.\") 
def lockhelper(cls): 
  \'\'\'cls 必须实现acquire和release静态方法\'\'\' 
  def _deco(func): 
    def __deco(*args, **kwargs): 
      print(\"before %s called.\" % func.__name__) 
      cls.acquire() 
      try: 
        return func(*args, **kwargs) 
      finally: 
        cls.unlock() 
    return __deco 
  return _deco 
class example: 
  @lockhelper(mylocker) 
  def myfunc(self): 
    print(\" myfunc() called.\") 
  @lockhelper(mylocker) 
  @lockhelper(lockerex) 
  def myfunc2(self, a, b): 
    print(\" myfunc2() called.\") 
    return a + b 
if __name__==\"__main__\": 
  a = example() 
  a.myfunc() 
  print(a.myfunc()) 
  print(a.myfunc2(1, 2)) 
  print(a.myfunc2(3, 4))

输出:

before myfunc called.
mylocker.acquire() called.
 myfunc() called.
 mylocker.unlock() called.
before myfunc called.
mylocker.acquire() called.
 myfunc() called.
 mylocker.unlock() called.
None
before __deco called.
mylocker.acquire() called.
before myfunc2 called.
lockerex.acquire() called.
 myfunc2() called.
 lockerex.unlock() called.
 mylocker.unlock() called.
3
before __deco called.
mylocker.acquire() called.
before myfunc2 called.
lockerex.acquire() called.
 myfunc2() called.
 lockerex.unlock() called.
 mylocker.unlock() called.
7

希望本文所述对大家的Python程序设计有所帮助。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...