`
nikoloss
  • 浏览: 33416 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[Python]从装饰器说开去

阅读更多
def deco(func):
    print "deco"
    return func
@deco
def foo():
    return "hello"
#main
if __name__=="__main__":
    print foo()

装饰器理解起来就是
def deco(func):
    print "deco"
    return func

def foo():
    return "hello"
#main
if __name__=="__main__":
    fun = deco(foo)
    print fun()

但是装饰器有个重要的特性就是在装饰的时候会调用一次
def deco(func):
    print "deco"
    return func
@deco
def foo():
    return "hello"
#main
if __name__=="__main__":
    pass

理解带参数的装饰器
def deco(**kw):
    print kw
    def _deco(func):
        return func
    return _deco
@deco(key="123")
def foo():
    return "hello"
#main
if __name__=="__main__":
    print foo()

理解起来就是
def deco(**kw):
    print kw
    def _deco(func):
        return func
    return _deco
def foo():
    return "hello"
#main
if __name__=="__main__":
    #print deco(key='123')(foo)()
    fun = deco(key='123')(foo)
    print fun()

利用装饰器在装饰时会调用一次,我们可以利用它在程序真正开始执行之前注册函数,以便方便的在需要的时候调用,实现逻辑解耦,举个栗子!
mapper={}

def deco(**kw):
    key = kw['key']
    def _deco(func):
        #如没有注册到mapper中就把该函数注册进mapper
        if key not in mapper:
            mapper[key] = func
        return func
    return _deco

@deco(key='get')
def foo1():
    return "call get"

@deco(key='post')
def foo2():
    return "call post"
    
#main
if __name__=="__main__":
    key = 'get'
    #查找key=get的函数
    call = mapper[key]
    #调用这个函数
    print call()

这样就形成了一个类似框架的东西,仔细观察的话,很像springMVC或者bottle,下一章节,我们就来用装饰器来封装一下python的web处理,服务器采用tornado,打算实现的最终目标如下:
@Router.route(url=r"hello/([a-z]+)",method=Router._GET|Router._POST)
def test(self,req,who):
    #http://localhost:8888/hello/billy
    return "Hi,"+who
    
@Router.route(url=r"greetings/([a-z]+)",method=Router._GET)
def test2(self,req,who):
    #http://localhost:8888/greetings/rowland
    raise Exception("error")

@Router.route(url=r"book/([a-z]+)/(\d+)",method=Router._GET|Router._POST)
def test3(self,req,categories,bookid):
    #http://localhost:8888/book/medicine/49875
    return "You are looking for a "+categories+" book\n"+"book No. " + bookid
    
@Router.route(url=r"json",method=Router._POST)
def test4(self,req):
    #http://localhost:8888/json
    #print req.request.body
    who=req.json_args.get("who","default")
    age=req.json_args.get("age",0)
    person={}
    person['who']=who
    person['age']=int(age)
    return person
1
1
分享到:
评论

相关推荐

    python类装饰器装饰方法通用编码模型分析.pdf

    python装饰器是一个用于封装函数、方法或类的代码的工具,用来显式指定管理它们的代码。一次编写,可用于多种不同的情况。在python 的流行框架中,装饰器应用越来越广泛。用类设计装饰器,可以利用实例属性保持装饰...

    Python 装饰器实现DRY(不重复代码)原则

    总结来说,Python装饰器通过提供一种便捷的方式来“装饰”或者修改函数的行为,使我们能够实现DRY原则,并且在不改变原有函数逻辑的情况下,添加新的功能。这种模式在代码维护和功能扩展方面提供了巨大的便利,并且...

    Python装饰器模式学习demo

    Python装饰器是一种高级编程技巧,它允许我们修改或增强函数、方法或类的行为,而无需对原始代码进行任何更改。装饰器本质上是一个接收一个函数作为输入并返回一个新的函数的函数。这种设计模式在Python中非常常见,...

    python——retry装饰器(csdn)————程序.pdf

    Python retry 装饰器详解 Python 语言中,retry 装饰器是一种非常有用的机制,能够帮助开发者在编写代码时,轻松地实现函数的重试机制。本文将对 Python 中的 retry 装饰器进行详细的讲解,包括其定义、使用方法、...

    装饰器---python.pdf

    装饰器是Python中一个强大的设计模式,它允许用户在不改变原有函数定义的情况下,增加额外的功能。本篇文章将深入剖析Python装饰器的引入、作用、定义方法、以及如何应用装饰器进行实际编程。 首先,装饰器是面向...

    python装饰器详解,python装饰器笔记心得.doc

    但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python。 1. 装饰器的基本概念 装饰器是一个函数...

    python使用装饰器(Decorator)的方式实现单例模式

    demo python使用装饰器(Decorator)的方式实现单例模式 functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择

    Python之装饰器共6页.pdf.zip

    在“Python之装饰器共6页.pdf”这份资料中,可能涵盖了装饰器的基本概念、如何创建装饰器、装饰器与闭包的关系、带参数的装饰器、装饰器链以及高级装饰器的使用技巧等内容。通过学习这些内容,开发者可以更好地理解...

    python装饰器写的斗地主

    总的来说,这个项目展示了Python装饰器在实际问题中的应用,尤其是在处理重复性任务或需要在不修改原有代码的基础上扩展功能时,装饰器的灵活性和便利性得到了充分的体现。通过学习这个案例,我们可以更好地理解和...

    python-装饰器Decorators.pdf

    简单来说,装饰器就是一个可以修改其他函数功能的函数。它们可以帮助我们编写更加简洁、可读性更强的代码,同时也使得代码更加符合Pythonic风格。 #### 二、Python中的函数特性 在Python中,函数具有以下特性: 1...

    python中装饰器和面向切面编程

    总的来说,Python的装饰器和面向切面编程提供了一种优雅的方式来组织和扩展代码,使代码更易于维护和理解。通过正确使用装饰器,我们可以将关注点分离,提高代码的重用性和模块化程度,同时保持代码的清晰和简洁。

    Python装饰器课程的PPT课件和源代码

    !!!CSDN的一个特性: 即使我...关于Python装饰器课程的课件代码相关文件, 文字版讲义见: https://blog.csdn.net/ncepu_Chen/article/details/106075394 视频版本讲义见: https://www.bilibili.com/video/BV1SZ4y1s7cv/

    Python装饰器-失败用例自动重试Python装饰器-失败用例自动重试Python装饰器-失败用例自动重试Python装饰器-失败用例自动重试Python装饰

    Python装饰器-失败用例自动重试

    深入学习Python中的装饰器使用

    的确,你可以使用python装饰器来实现装饰器模式,但这绝对是它很小的一部分功能,有点暴殄天物。对于python装饰器,我觉得它是最接近宏的存在。 宏的历史 宏有有着非常悠久的历史,不过大多数人可能会有使用C语言...

    详解Python装饰器由浅入深

    【Python装饰器详解】 装饰器在编程中是一种强大的工具,尤其在Python中,它使得代码更加灵活和可扩展。装饰器本质上是一个接收函数并返回新函数的函数,它允许我们修改或增强函数的行为,而无需修改函数本身的源...

    python使用装饰器作日志处理的方法

    装饰器这东西我看了一会儿才明白,在函数外面套了一层函数,感觉和java里的aop功能很像;写了2个装饰器日志的例子, 第一个是不带参数的装饰器用法示例,功能相当于给函数包了层异常处理,第二个是带参数的装饰器...

    python 装饰器(示例)

    总结来说,Python装饰器是实现设计模式的一种方式,它提供了优雅的代码组织和功能扩展手段,让我们可以在不修改原始代码的基础上,方便地插入额外的功能或修改原有行为。通过熟练掌握装饰器,我们可以编写更清晰、更...

    Python 如何使用装饰器判定用户操作权限 Python源码

    Python 如何使用装饰器判定用户操作权限 Python源码Python 如何使用装饰器判定用户操作权限 Python源码Python 如何使用装饰器判定用户操作权限 Python源码Python 如何使用装饰器判定用户操作权限 Python源码Python ...

    8 Python 装饰器1

    Python装饰器详解 Python装饰器是Python中一种非常强大且灵活的工具,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象,它经常用于有切面需求的场景,比如:插入日志...

    浅谈python装饰器探究与参数的领取

    总结来说,Python装饰器是强大的工具,它们通过高阶函数的机制实现了对函数的动态增强。理解装饰器的工作原理以及如何处理参数是掌握Python高级编程的关键。通过装饰器,我们可以优雅地添加日志、性能追踪、错误处理...

Global site tag (gtag.js) - Google Analytics