Day 3-5 装饰器
开放-封闭原则:
- 封闭:已实现的功能代码块不应该被修改.
- 开放:对现有功能的扩展开放.
装饰器:
定义:在符合'开放-封闭'的原则下,给程序扩展其他的功能!
例:在不更改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 装饰器的更多相关文章
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- python装饰器
今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- [原创]django+ldap实现单点登录(装饰器和缓存)
前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- python cookbook 学习系列(一) python中的装饰器
简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...
- python基础补漏-05-生成器和装饰器
[1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...
- python --> 递归 以及装饰器
一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数 ...
- python 装饰器的理解
一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
随机推荐
- Codeforces Round #542 C. Connect 搜索
C. Connect time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- C#反射の一个泛型反射实现的网络请求框架
点击下载源码 C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转)
- (3)Python字符串
- [1] YOLO 图像检测 及训练
YOLO(You only look once)是流行的目标检测模型之一, 原版 Darknet 使用纯 C 编写,不需要安装额外的依赖包,直接编译即可. CPU环境搭建 (ubuntu 18.04) ...
- [HEOI2015]小Z的房间 && [CQOI2018]社交网络
今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...
- 【vue】vue +element 搭建项目,要求既支持pc端又支持移动端
使用场景:有适配pc端改为适配pc端和移动端,使用2套css 代码实现App.vue created: function () { if(document.documentElement.client ...
- Flask-信号(blinker)
简单了解信号 Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为.简单来说就是flask在列表里面,预留了几个空列表,在里面存东西.信号通过发送通知 ...
- CF176E Archaeology
CF176E Archaeology 有一棵 \(n\) 个点的带权树,每个点都是黑色或白色,最初所有点都是白色的.有 \(m\) 个询问: 把点 \(x\) 从白色变成黑色 把点 \(x\) 从黑色 ...
- jar包读取外部文件
public static void main(String[] args) { String path1 = System.getProperty("user.home");// ...
- FineUIMvc新特性速递(大间距模式,隐藏菜单垂直滚动条)
即将发布的 FineUIMvc 新版本会引入两个重要的特性,用来提升用户体验,现在就来先睹为快吧: 大间距模式 我们已经支持的显示模式有:紧凑模式,普通模式,大字体模式. 紧凑模式: 普通模式: 大字 ...