首页 > 编程语言 > 详细

python学习笔记(4) 装饰器

时间:2018-10-27 22:05:30      阅读:134      评论:0      收藏:0      [点我收藏+]

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‘)

 

python学习笔记(4) 装饰器

原文:https://www.cnblogs.com/farion/p/9863590.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!