zoukankan      html  css  js  c++  java
  • python之6-4装饰器.md

    • 装饰器看的说实话真心郁闷,群里一伙计说了好一会,听得一愣一愣的,查了点资料,又自己试了下,算是明白了一些,记录记录=.=更郁闷的是,博客园的markdown标记支持怎么和为知的不匹配,这转过来的文章很多标记没起作用...(代码不能有#,代码间不能有空格,这真吭)

    • 不传递参数的装饰器

      • 即将主体函数当做装饰器的外层函数decorator的参数,从而指向装饰器的内层函数wrappers,而内层函数wrappers调用外层函数decorator的参数(主体函数),来实现其他功能,最后内层函数wrappers返回一个结果.

      • 例如下面这个:结果应该为6

    --!/usr/bin/env python
    --coding = utf-8
    def decorator(fun):
        def wrappers(*x):
            sum = 0
            for y in x:
                sum = (sum + fun(y))*y
            return sum
        return wrappers
    @decorator
    def test(*x):
        for x in x:
            return x
    print test(1,2)
    
    • 一个传递参数的装饰器,同时实现了不含参数的装饰器

      • 含参数的装饰器,其实是在不含参数的装饰器最外部,再加一层函数,此函数返回一个不含参数的装饰器,从而让最里面的wrappers函数继承最外面的传参函数.

      • 例如下面这个:

    --!/usr/bin/env python
    --coding = utf-8
    --三层嵌套和两层嵌套的区别在于,三层的最外层接收的是一个字符串,两层最外层接收的是一个函数,因此,利用if判定最外层是否是函数,来决定子函数的层数
    def log(d1):
    --hasattr函数可以判定一个对象是否拥有某个属性,这里使用函数的_name_属性来判定
    当d1有_name_属性的时候,说明是一个函数,直接执行wrappers封装
        if hasattr(d1, '__name__'):
            def wrappers(*args):
                print "start call"
                d1(*args)
                print "end call"
            return wrappers
    --当d1没有_name_属性的时候,说明是一个字符串,执行三层嵌套
        else:
            def decorator(fun):
                def wrappers(*args):
                    print "%s start call" %(d1)
                    fun(*args)
                    print "%s end call" %(d1)
                return wrappers
            return decorator
    @log('2014')
    def log1():
        print 'This is log1'
    log1()
    @log
    def log2():
        print 'This is log2'
    log2()
    
    [星空刺] |-->一颗星辰一闪即逝,支撑它的唯有方向和目的
  • 相关阅读:
    RIA Animation test.
    深入浅出REST
    HTTP header中的 Cachecontrol
    Silverlight操纵html元素
    Comparing Azure storage and SQL Data Services
    SharePoint 2010 集成Window Live 认证遇到的问题 part 2
    SharePoint2010 此工作簿未存储在 Excel Services 应用程序 中受信任的位置,因此无法打开。
    SharePoint2010 使用Designer开发工作流 如何引用其他列表的查阅项
    SharePoint 2010 item级的权限控制
    Infopath 2010 如何设计虚线底框应用于合同中的输入框
  • 原文地址:https://www.cnblogs.com/aaa103439/p/3844234.html
Copyright © 2011-2022 走看看