开放-封闭原则:

  • 封闭:已实现的功能代码块不应该被修改.
  • 开放:对现有功能的扩展开放.

装饰器:

定义:在符合'开放-封闭'的原则下,给程序扩展其他的功能!

例:在不更改tokyo函数的情况下。给tokyo函数加上一个验证模块。

 def tokyo():
print('日本专区'.center(30, '-')) def america():
print('美洲专区'.center(30, '-')) def euro():
print('欧洲专区'.center(30, '-')) user_status = False def login(func):
def inner():
global user_status
if user_status == False:
user = input('user:').strip()
password = input('password:')
if user == 'alex' and password == '':
print('welcome....')
user_status = True
if user_status:
func() # 用户通过验证后,执行login传进来的函数.
return inner # 把inner的内存地址返回给login(func),所以下面tokyo = login(tokyo)的时候,其实等于tokyo = login(tokyo) = inner
  # 相当于用闭包和函数的重新赋值,完成了装饰器. tokyo = login(tokyo)
tokyo()

上面的代码也可以简写成下面的形式:

 user_status =False
def login(func): def inner(*args): # *args 非固定参数,可以多传或者不传
acc_user = 'alex'
acc_pwd = ''
global user_status
if user_status == False:
username = input('username>>>')
password = input('password>>>')
if username == acc_user and password == '':
print('welcome,%s' % username)
user_status = True
else:
print('username or password Error.')
else:
print('已通过验证,欢迎您!')
if user_status == True:
func(*args)
return inner # 把inner的内存地址返回给login(). def home():
print('首页'.center(34, '*')) def euro():
print('欧洲专区'.center(30, '*')) @login
def japan(stlye):
print('日本专区'.center(30, '*'),stlye) @login          # 在要加验证的函数前加上@+验证函数.相当于,@login(america).在程序运行时,会默认先运行一次.@login(america)返回的是inner的内存地址,当调用america()时,等价于america()=inner()
def america():
print('美洲专区'.center(30, '*')) japan('6666') # 如果在这里传参,相当于把这个参数传给inner('666')

Day 3-5 装饰器的更多相关文章

  1. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  2. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  3. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  4. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  5. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  6. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

  7. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

  8. python --> 递归 以及装饰器

    一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数 ...

  9. python 装饰器的理解

    一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...

  10. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

随机推荐

  1. [Windows]查看运行进程的参数【wmic】

    参考  https://www.cnblogs.com/top5/p/3143827.html     和 https://blog.csdn.net/swazer_z/article/details ...

  2. dep包安装与依赖库

    安装 点击下载 .deb 包:使用sudo dpkg -i xxx.deb 命令安装 依赖库问题 用sudo apt-get install -f解决依赖问题,解决后重新运行dpkg -i安装命令 验 ...

  3. VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)

      目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...

  4. 【ES6】let 命令

    let命令 为es6新增命令,用来声明变量,类似于var,但是let所声明的变量,只在let命令所在的块级作用域内有效 块级作用域写法(ES6块级作用域允许任意嵌套): // 块级作用域写法 { le ...

  5. ubantu下装Docker

    Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker. 通过 uname -r 命令查看你当前的内核版本 unam ...

  6. mysql从5.5直接升级到5.7后,执行mysql_upgrade速度很慢且执行结束后数据目录大小增加一倍及 mysqlpump备份出现1577错误

    mysql官网不支持夸大版本升级,比如跳过5.6直接升级到5.7,但由于一些客观原因,项目需要从5.5直接升级到5.7,以下是具体操作 1.备份之前mysql,(数据量少,可直接拷贝安装目录及data ...

  7. HBase篇(4)-你不知道的HFile

    [每日五分钟搞定大数据]系列,HBase第四篇 这一篇你可以知道, HFile的内部结构? HBase读文件细粒度的过程? HBase随机读写快除了MemStore之外的原因? 上一篇中提到了Hbas ...

  8. WebApi集成Swagger

    1.新建一个WebApi空项目 2.新建一个Person实体类: public class Person { public int ID { get; set; } public string Use ...

  9. (转)C#中的那些全局异常捕获

    C#中的那些全局异常捕获(原文链接:http://www.cnblogs.com/taomylife/p/4528179.html)   1.WPF全局捕获异常       public partia ...

  10. Django 中间件版登录验证

    中间件版的登录验证需要依靠session,所以数据库中要有django_session表. urls.py # urls.py from django.conf.urls import url fro ...