Pyhton自由之路(六)闭包与装饰器

简介: 设计模式中有一种叫做装饰者模式,而在JAVA社区中,有一种技术被称之为AOP。个人理解为,在某一过程运行时程序能动态地控制过程的行为。可惜目前的我离这个目标还有段距离,只能通过反射机制动态控制过程的始末。
设计模式中有一种叫做装饰者模式,而在JAVA社区中,有一种技术被称之为AOP。
个人理解为,在某一过程运行时程序能动态地控制过程的行为。可惜目前的我离这个目标还有段距离,只能通过反射机制动态控制过程的始末。
 来看一个简单的例子:
 def test(sec):
      print 'please wait',
      for i in range(sec):
          sleep(1)
          print '.',       
      print 'over~!'
这是一个简单的过程,现在要在这个过程的前后加上时间日志。我们定义一个日志记录函数
 def log(func):
      def wrapperfunc(*args):
         print 'Function Runing..at',ctime()
         func(*args)
         print 'Function Finished..at',ctime()
      return wrapperfunc
在程序中测试方法def test(sec)上面加上 ’@log’,再次运行调用test(3),可以发现python中利用闭包实现AOP是多么简洁优雅。关于(*args)请参考API中“可变长度的参数”
你也可以使用带参数的函数修饰符 ’@log(who,when)’来动态决定使用怎样的装饰规则。
看下面的例子:
img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
def log(who,when):
    
def logged(f):
        
def wrapperfunc(*args):
            
print 'Function Runing..at',when
            f(
*args)
            
print 'Function Finished..at',ctime()
        
return wrapperfunc
    
    
def welcome(func):
        
def wrapperHello(*args):
            
print 'Hello',who,',welcome accessing'
            func(
*args)
            
print 'Goog Bye,',who
        
return wrapperHello
 
    
if who =='' :
        
return logged
    
else:
        
return welcome
@log(
'ysisl',ctime())
def test(sec):
    
print 'please wait',
    
for i in range(sec):
        sleep(
1)
        
print '.',        
 
print 'over!'
如果运用得当,这样的功能可以给我们的程序带来很强的可扩展性。顺便说一下,可以把log等这些装饰者函数放在其他模块的类中,我们导入模块from _module import _class,然后在要装饰的函数上加上 ’@_class.log’,能够这样使用的前提是log函数必须在类中声明为静态函数,即在log()也加上修饰符 ’@staticmethod’,从这也可以看出,函数修饰是可以迭加的。
目录
相关文章
|
4月前
|
程序员 Python
从零到一,彻底掌握Python闭包与装饰器的精髓,成为编程界的隐藏Boss
【7月更文挑战第7天】探索Python编程的两大基石:闭包与装饰器。闭包是内部函数记住外部作用域的变量,如`make_multiplier_of`返回的`multiplier`,它保持对`n`的引用。装饰器则是函数工厂,接收函数并返回新函数,如`my_decorator`,它在不改变原函数代码的情况下添加日志功能。掌握这些,让代码更优雅,效率更高,助你成为编程高手。
32 3
|
4月前
|
Python
Python黑魔法揭秘:闭包与装饰器的高级玩法,让你代码飞起来
【7月更文挑战第7天】Python的闭包和装饰器是提升代码效率的神器。闭包是能记住外部作用域变量的内部函数,常用于动态函数创建。示例中,`make_multiplier_of`返回一个保留`n`值的闭包。装饰器则是一个接收函数并返回新函数的函数,用于在不修改原函数情况下添加功能,如日志或性能追踪。`@my_decorator`装饰的`say_hello`函数在执行时会自动加上额外操作。掌握这两者,能让Python代码更优雅、强大。**
33 1
|
4月前
|
程序员 Python
程序员必看!Python闭包与装饰器的高级应用,让你的代码更优雅、更强大
【7月更文挑战第7天】Python中的闭包和装饰器是高级特性,用于增强代码功能。闭包是内部函数记住外部作用域的变量,常用于动态函数和函数工厂。示例展示了`make_multiplier_of`返回记住n值的`multiplier`闭包。装饰器则是接收函数并返回新函数的函数,用于不修改原函数代码就添加功能。`my_decorator`装饰器通过`@`语法应用到`say_hello`函数上,展示了在调用前后添加额外行为的能力。这两种技术能提升代码的优雅性和效率。
38 3
|
4月前
|
监控 测试技术 Python
探索Python魅力:利用闭包与装饰器优化代码结构
【7月更文挑战第7天】Python中的闭包和装饰器是强大工具。闭包是能记住外部作用域变量的内部函数,常用于动态函数创建和数据封装。装饰器是接收函数并返回新函数的函数,用于在不修改原代码的情况下扩展功能,如日志或性能监控。通过示例展示了如何使用它们优化代码结构和提升效率。掌握这两者,能写出更优雅高效的Python代码。
20 0
|
4月前
|
Python
Python高手进阶必备:闭包与装饰器的那些不为人知的高级技巧
【7月更文挑战第6天】Python中的闭包和装饰器是提升代码质量的关键。闭包是能记住外部作用域变量的内嵌函数,常与匿名函数结合,示例展示了如何通过闭包创建具特定行为的函数。装饰器则是不修改原函数即可添加功能的语法结构,它们接收函数作为输入并返回新函数。结合使用,如参数化装饰器,能动态改变函数行为。掌握这些技巧,能增强代码可读性和复用性,推荐在实践中多加利用。
25 0
|
4月前
|
Python
告别代码冗余!Python闭包与装饰器如何让你秒变代码优化大师?
【7月更文挑战第6天】Python的闭包和装饰器是解决代码冗余的利器。闭包,如匿名函数,记忆外部作用域变量,实现代码封装。例如,`make_multiplier_of`生成特定乘法函数,避免重复。装饰器如`@my_decorator`,不修改原函数,添加额外功能,如在函数调用前后打印信息。两者结合,提升代码灵活性和复用性,是优化和整洁代码的关键。
26 0
|
4月前
|
Python
深度剖析:Python闭包与装饰器如何联手打造函数界的超级英雄
【7月更文挑战第6天】在Python中,闭包和装饰器是提升代码效率的关键。闭包是记住外部作用域变量的内部函数,如`outer`返回的`inner`函数。装饰器是不修改原函数即可添加功能的函数,如`my_decorator`。当两者结合,如`repeat`装饰器,能动态改变函数行为,如重复执行`greet`函数指定次数,展示出强大的代码灵活性和优雅性。学习和运用这些工具,能让你的Python编程更上一层楼。
24 0
|
4月前
|
Python
惊艳!原来Python闭包与装饰器可以这样玩,让你的代码瞬间高大上
【7月更文挑战第6天】Python中的闭包和装饰器是代码复用和增强功能的利器。闭包是能记住外部作用域变量的内嵌函数,常用于封装和优化代码。例如,`make_multiplier_of`生成了乘法函数,如`times3`和`times5`,避免了重复代码。装饰器则不修改原函数即可添加新功能,如`my_decorator`在函数调用前后打印信息。当两者结合,如`repeat`装饰器,可以根据参数动态改变函数行为,如重复执行`greet`函数。闭包和装饰器的协同使用提升了代码的优雅性、效率和可扩展性。
25 0
|
分布式计算 索引 Python
猿创征文|Python迭代器、生成器、装饰器、函数闭包
猿创征文|Python迭代器、生成器、装饰器、函数闭包
123 0
猿创征文|Python迭代器、生成器、装饰器、函数闭包
|
监控 NoSQL 程序员
一则小故事带你弄清Python装饰器
装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题。装饰器 `(Decorators)` 是 Python 的一个重要部分。简而言之:**Python中的装饰器就是拓展原来函数功能的一种函数