第十四章装饰器

装饰器

# 开放封闭原则
- 1.对扩展是开放的
- 2.对修改是封闭的

# 在不修改源代码和调用方式的情况下,对函数进行扩展
# 第一版装饰器
def times(func):
   def foo():
       print('装饰001')
       func()
       print('装饰002')
   return foo

def func1():
   print("今天是个好日子1")

func1 = times(func1)
func1()
# python内置的语法糖
# 要将语法糖放在被装饰的函数正上方
def times(func):
   def foo():
       print('装饰001')
       func()
       print('装饰002')

   return foo

@times
def func1(): # func1 = times(func1)
   print("被装饰的函数1")

@times
def func2(): # func2 = times(func2)
   print("被装饰的函数2")

func1()
# 有参数的函数语法糖
def func(func):

   def foo(*args, **kwargs):
       print('装饰001')
       func(*args, **kwargs)
       print('装饰002')
   return foo


@func
def func1(*args, **kwargs):
   print(args,kwargs)
   print('被装饰的函数1')


@func
def func2(*args, **kwargs):
   print(args,kwargs)
   print('被装饰的函数2')


func2(5)
# 要求
#博客园登陆之后有几个页面,diary,comment,home,如果我要访问这几个页面,必须验证我是否已登录。 如果已经#成功登录,那么这几个页面我都可以无阻力访问。如果没有登录,任何一个页面都不可以访问,我必须先登录,登录成功#之后,才可以访问这个页面。

user_status = {
  'user_name': None,
  'user_status': False

}


def auth(func):

  def foo():
      if user_status['user_status']:
          ret = func()
          return ret

      user_name = input('name:')
      user_pwd = input('pwd:')
      if user_name == 'xuhuo' and user_pwd == '123456':
          user_status['user_status'] = True
          ret = func()
          return ret
  return foo


@auth
def zhu_ye():
  print('欢迎来到博客园主页。')


@auth
def dirary():
  print('欢迎来到博客园的日记页面。')


@auth
def ping_lun():
  print('欢迎来到评论页面。')


@auth
def sui_bi():
  print('欢迎来到随笔页面。')


zhu_ye()
sui_bi()
dirary()
ping_lun()

PythonDay14的更多相关文章

  1. Python--day14(迭代器)

    今日主要内容 1.  带参装饰器 (了了解) 2.  迭代器(*****) 可迭代对象 迭代器对象 for迭代器 枚举对象 1.  带参装饰器 1.  通常,装饰器为被装饰的函数添加新功能,需要外界的 ...

  2. python---day14( 内置函数二)

    内置函数二一:匿名函数 lambda函数 lambda 表示匿名函数,不需要用def 来申明. 语法: 函数名=lambda 参数:返回值 ----〉 案例:f=lambda n:n*n 例子01: ...

  3. 路飞学城Python-Day14(practise)

    本章总结 练习题 1.logging模块有几个日志级别? 5个,按级别从高到低分别是 CRITICAL(灾难)>ERROR(错误)>WARNING(警示)>INFO(信息)>D ...

  4. 路飞学城Python-Day14

    转载:python之路-路飞学城-python-book [25.常用模块-logging模块详解] [26.常用模块-logging模块详解2] [27.常用模块-logging模块日志过滤和日志文 ...

  5. python-day14(正式学习)

    目录 三元表达式 列表推导式 字典生成式 zip()方法 生成器 yield关键字 迭代套迭代 send(value) close() throw() 自定义range方法 生成器表达式 匿名函数 与 ...

随机推荐

  1. 51 Nod Bash 游戏v2

    1067 Bash游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  取消关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3 ...

  2. 16位masm汇编实现记忆化递归搜索斐波那契数列第50项

    .model small ;递归fib,使用压缩BCD码,小端派 .data y1 byte 6 dup(0) y2 byte 6 dup(0) vis byte 1,1,1,61 dup(0) ;便 ...

  3. win10 exe如何添加或禁用开机自启动项

    一.添加开机自启动 1,先打开存放自启动软件文件的文件夹 方法①:在文件搜索框中输入或粘贴以下地址: C:\ProgramData\Microsoft\Windows\Start Menu\Progr ...

  4. vue-router中,require代替import解决vue项目首页加载时间过久的问题

    vue的路由配置文件(routers.js),一般使用import引入的写法,当项目打包时路由里的所有component都会打包在一个js中,在项目刚进入首页的时候,就会加载所有的组件,所以导致首页加 ...

  5. Linux-expect脚本-1

    expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 首行加上/usr/bin/expect spawn: 后面加上需要执行的shell命令,比如说spawn sudo ...

  6. 前端学习之一_html学习

    html元素分类 内连元素:出现在行内的元素            <img>,<q>,<a> 块元素:前后自动插入换行的元素         <h1> ...

  7. Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一

    下次会为大家深入解析这个小工具.  最先看到这个工具是在EF产品组最新的博客文章上,http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power ...

  8. JSP——JSTL定制标签 - 递归标签显示属性结构

    编写定制标签分为三个步骤:编写标签处理器.配置标签.使用标签. 1.标签处理器 标签处理器和标签是一一对应的关系 package com.oolong.utils.customtags;   impo ...

  9. oracle数据库连接数反推公式

    sessions=1.1*processes+5,transactions=1.1*sessions.

  10. java 正则表达式:有丶东西

    非常详细 原文地址:https://blog.csdn.net/jeffleo/article/details/52194977