资讯专栏INFORMATION COLUMN

Python Enclosing作用域、闭包、装饰器话聊下篇

DirtyMind / 3366人阅读

摘要:作用域闭包装饰器话聊下篇作用域闭包装饰器的基础篇,请看作用域闭包装饰器话聊上篇我经常看到有人的装饰器是带参数的,这又是咋回事呢这个其实很简单的,你还记得上次我说相当于那么相当于也就是说,返回的是一个装饰器函数,然后再去装饰其他函数。

Python Enclosing作用域、闭包、装饰器话聊下篇

Python Enclosing作用域、闭包、装饰器的基础篇,请看Python Enclosing作用域、闭包、装饰器话聊上篇

Jaglawz: 我经常看到有人的装饰器是带参数的,这又是咋回事呢?

Pylego: 这个其实很简单的,你还记得上次我说:

@deco
def foo():
    pass

# 相当于: foo = deco(foo)
# 那么
@new_deco(*args, **kwargs)
def bar():
    pass
    
# 相当于: bar = new_deco(*args, **kwargs)(bar)

Jaglawz: 也就是说,new_deco返回的是一个装饰器函数,然后再去装饰其他函数。那类装饰器又是怎么回事呢?

Pylego: 你知道Python的对象可以像函数一样调用吗?

from hashlib import sha256


class HashCache(object):
    def __init__(self):
        self.cache = {}
        
    def __call__(self, string):
        if string not in self.cache:
            self.cache[string] = sha256(string).hexdigest()
        return self.cache[string]
            
            
hc = HashCahce()
hc("foo")  # 像函数一样调用hc对象
hc("foo")
hc("bar")

Jaglawz: 如果是这样的话我就明白了。

class FibCache(object):
    def __init__(self, func):
        self.func = func
        self.cache = {}
    
    def __call__(self, n):
        if n not in self.cache:
            self.cache[n] = self.func(n)
        return self.cache[n]
        
        
@FibCache
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
        
# 相当于: fib = FibCache(fib)
# fib(10)相当于FibCache(fib)(10)
# 装饰后的fib是FibCache的一个对象而已

# 也就是说作为装饰器的类的构造方法要接收一个待装饰的函数,然后__call__函数的参数要和待装饰的函数的参数是一样的(除了self),这样的类就可以用来装饰函数了

Pylego: 你这个装饰器厉害,还给fibnacci函数加了缓存,佩服!

Jaglawz: 我不会告诉你我是看了大神的杰作然后吓吓唬吓唬你的!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45504.html

相关文章

  • Python Enclosing作用闭包装饰话聊上篇

    摘要:作用域闭包装饰器话聊上篇听讲一切都是对象,是吗是的,像函数也是对象。不错嘛这都被你看出来了,那你知道作用域的原则吗我知道是知道可以我就是对那个作用域不是很理解。如果内部函数引用到外层函数作用域的对象,这个内部函数就称为闭包。 Python Enclosing作用域、闭包、装饰器话聊上篇 Jaglawz: 听讲Python一切都是对象,是吗? Pylego: 是的,像函数也是对象。 Ja...

    Faremax 评论0 收藏0
  • Python Closure

    摘要:在计算机科学中,闭包又称词法闭包或函数闭包,是引用了自由变量的函数。闭包被广泛应用于函数式语言中。运用闭包可以避免对全局变量的使用。将栈顶的元素取出,创建元组,并将该元组进栈。 在计算机科学中,闭包 又称 词法闭包 或 函数闭包,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。闭包被广泛应用于函数式语言中。 从上面这段话中可以看出闭...

    n7then 评论0 收藏0
  • Python中的函数装饰器和闭包

    摘要:变量查找规则在中一个变量的查找顺序是局部环境,闭包,全局,内建闭包引用了自由变量的函数。闭包的作用闭包的最大特点是可以将父函数的变量与内部函数绑定,并返回绑定变量后的函数,此时即便生成闭包的环境父函数已经释放,闭包仍然存在。 导语:本文章记录了本人在学习Python基础之函数篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握装饰器的本质、功...

    caozhijian 评论0 收藏0
  • Python_装饰器和生成器

    摘要:迭代器迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只往前不会往后退。生成器特点保存了一套生成数值的算法。 迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只往前不会往后退。 可迭代对象 以直接...

    sugarmo 评论0 收藏0
  • python闭包探究一二

    摘要:在嵌套函数中访问了最外层函数的参数,结果我们是能正常访问闭包我们将上面的最外层的返回值修改为返回嵌套函数的引用一切皆对象根据前面变量生存期例子,按理说调用完的生命周期应该结束了,调用应该失败才对,但是实际却调用成功了。 复习 python引用变量的顺序: 当前作用域局部变量 -> 外层作用域变量 -> 当前模块中的全局变量 -> python内置变量 global:声明一个全局变量 n...

    jzman 评论0 收藏0

发表评论

0条评论

DirtyMind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<