python学习笔记(4) 装饰器

import time

def timer(f):

  def inner():

    start = time.time()

    ret = f()

    end = time.time()

    print(end-start)

    return ret

  return inner             #返回函数地址,没有括号

@timer

def func():

  time.sleep(1)

  print'大家好我是渣渣辉'

  return '是兄弟就来砍我'

ret = func()  #此处实际上执行的是inner

print(ret)

#在不修改原函数的情况下添加功能,timer就是一个装饰器函数

#################################################

装饰器标准格式

def wrapper(f):

  def inner(*args,**kwargs):

    ret = f(*args,**kwargs)

    return ret

  return inner

装饰器的本质:闭包函数

#################################################

from functools import wraps

def wrapper(func):

  @wraps(func)

  def inner(*args,**kwargs):

    print('大家好')

    ret = func(*args,**kwargs)

    print('这是你没玩过的全新版本')

    return ret

  return inner

@wrapper  #legend = wrapper(legend)

def legend(a):

  print('我是%s'%(a))

  return '是兄弟就来砍我'

print(legend.__name__)

print(legend.__doc__)

ret = legend('渣渣辉')

print(ret)

#演示装饰器和函数的执行顺序

######################################################

为多个函数增加记录调用功能,先将被调用的函数名称写入文件

def log(func):

  def inner(*args,**kwargs):

    with open('log','a',encoding= utf8) as f:

      f.write(func.__name__+'\n')

    ret = func(*args,**kwargs)

    return ret

  return inner

@log

def shoplist_add():

  print('购物车增加一件商品')

@log

def shoplist_del():

  print('购物车删除一件商品')

###################################################

为多个函数增加单次登陆验证

FLAG = 0

def login(func):

  def inner(*args,**kwargs):

  global FLAG

  if FLAG:

    ret = func(*args,**kwargs)

    return ret

  else:

    uername = input('请输入用户名:')

    userpwd = input('请输入密码:')

    if username == '天使萌' and userpwd =='123':

      FLAG = 1

      ret = func(*args,**kwargs)

      return ret

    else:

      print('登陆失败')

  return inner

@login

def shoplist_add():

  print('购物车增加一件商品')

@login

def shoplist_del():

  print('购物车删除一件商品')

shoplist_add()

shoplist_add()

shoplist_del()

shoplist_del()

###############################################

读取网页内容并储存到文件,如果文件有内容则直接从文件读取

import os

from urllib.request import urlopen

def cache(func):

  def inner(*args,**kwargs):

    if os.path.filesize('web_cache'):

      with open('web_cache','wb') as f:

        return f.read()

    ret = func(*args,**kwargs)

    with open('web_cache','wb') as f:      

      f.write(b'*****'+ret)                #以十六进制写入

    return ret

  return inner

@cache

def get(url):

  code = urlopen(url).read()

  return code

ret = get('baidu.com')

print('ret')

猜你喜欢

转载自www.cnblogs.com/farion/p/9863590.html