python-装饰器

函数继续更新中......

小插曲,昨天在编程中

str = '1,2,3'
tup_1 = (1,2,3)
if isinstance(tup_1[0].str):
        print('是字符串类型')
#运行后报错,原因之前定义了str,没有注意到全局变量与局部变量的关系 
#TypeError: isinstance() arg 2 must be a type or tuple of types

#获取str对像的属性和方法

>>>dir('ABC')   

装饰器的形成:

简单的装饰器:import time

import time
def func_1():
    time.sleep(0.1)
    print('aaaa')

def timer(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print(end - start)
    return inner

func_1 = timer(func_1)
func_1()

  

使用time()模块
import time

def timer(f):
    start = time.time()
    f()
    end = time.time()
    print(end-start)

def func_1():
   time.sleep(0.1)
   print('aaaaa')

timer(func_1) 

装饰器的作用:

    不能修改函数的调用方式

    但还想在原来的函数前后添加功能

    timmer就是一个装饰器函数,只是对一个函数有一些装饰作用

语法糖:

import time
def timer(f):   
    def inner():
        start = time.time()
        f()        #被装的函数
        end = time.time()
        print(end - start)
    return inner

#@timmer 相当于func_1 = timer(func_1)
@timmer  #语法糖,在函数上方 @装饰器函数名
def func_1():
    time.sleep(0.1)
    print('aaaa')
   
func_1()

语法糖@ 相当于调用

 

def func_A(args):
    print('A')
    a = args()
    return 

@funcA
def func_B():
    print('B')

$A
$B

 

  

 

接装饰器,调用方法添加返回值

import time
@timmer    #语法糖 @装饰器函数名
def func_1():
    time.sleep(0.1)
    print('aaaa')
*   return '新年好'

def timer(f):   
    def inner():
        start = time.time()
*       ret = f()     #被装饰的函数
        end = time.time()
        print(end - start)
*       return ret
    return inner
#func_1 = timer(func_1)

f = func_1()

插曲 

def outer():
    def inner():
        return 'inner'
    inner()
outer()  
#没有返回值 None 
#分析原因:outer()函数内部调用inner(),跳转至inner()方法返回值'inner'
但outer()函数本身没返回值不能接收inner()返回的变量,所以返回None

装饰器,为原函数添加1个及多个参数

@timer    #语法糖 @装饰器函数名
*def func_1(a,b):
    time.sleep(0.1)
    print('aaaa',a,b)
    return '新年好'
    
def timer(f):   #被装的函数
    def inner(*args,**kwargs):
        start = time.time()
*       ret = f(*args,**kwargs) 这里的*代表打散做用,f是被修饰的函数
        end = time.time()
        print(end - start)
        return ret
    return inner
#func_1 = timer(func_1)

*f = func_1(a)

装饰器的固有模式

def wrapper(func):
   def inner(*args,**kwargs):
         ret = func(*args,**kwargs)
         return ret
   return inner

  

  

  

 

  

 

posted @ 2017-12-28 15:35  wsg-python  阅读(132)  评论(0编辑  收藏  举报