`
nikoloss
  • 浏览: 33516 次
  • 性别: 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.pdf

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

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

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

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

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

    python装饰器写的斗地主

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

    python的装饰器包

    python的装饰器包

    python-装饰器Decorators.pdf

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

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

    总结来说,Python 类装饰器和装饰方法的通用编码模型是编程中的一个重要概念,它们提供了灵活的代码组织和功能扩展手段。通过理解装饰器的工作原理和设计模式,开发者可以更有效地利用这一特性来提高代码的可维护性...

    Python装饰器的定义与应用

    内容概要:本文介绍了Python装饰器的概念及其优点,详细解释了装饰器的构造以及使用案例。文中通过具体实例阐述了如何运用装饰器增强原有函数的功能而不改变函数内部代码,例如统计函数执行时间和添加日志记录等功能...

    Python-rediscache一个Redis的缓存装饰器

    总结来说,"Python-rediscache"是一个便捷的工具,它将Redis的强大缓存能力与Python的装饰器机制结合,使得在Python应用中实现高效的数据缓存变得简单易行。通过灵活的配置和使用,开发者可以有效地提升程序性能,...

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

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

    python 装饰器(示例)

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

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

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

    Python中的各种装饰器详解

    Python中的装饰器是一种强大的工具,用于在不修改原始函数代码的情况下扩展或修改其功能。装饰器本质上是一个接收函数作为输入并返回新函数的函数。在Python中,它们主要用于处理类和函数的元编程。 1. **函数式...

    8 Python 装饰器1

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

    10_python装饰器.pdf

    标题《10_python装饰器.pdf》说明本文档是一份关于Python装饰器的电子课件。装饰器是Python中用于增强函数或类功能的一种设计模式,通常用于代码复用、修改或者插入新的功能。装饰器是Python中的高级特性,使用它们...

    Python装饰器.docx

    Python装饰器

    老生常谈Python之装饰器、迭代器和生成器

    “装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们...

Global site tag (gtag.js) - Google Analytics