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) ...
随机推荐
- Spring Web项目spring配置文件随服务器启动时自动加载
前言:其实配置文件不随服务器启动时加载也是可以的,但是这样操作的话,每次获取相应对象,就会去读取一次配置文件,从而降低程序的效率,而Spring中已经为我们提供了监听器,可监听服务器是否启动,然后在启 ...
- 设计模式のFacadePattern(外观模式)----结构模式
一.产生背景 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. ...
- 5.03-requests_ssl
import requests url = 'https://www.12306.cn/mormhweb/' headers = { 'User-Agent': 'Mozilla/5.0 (Macin ...
- maven 经常使用命令
版权声明:本文为博主原创文章,未经博主同意不得转载. 安金龙 的博客. https://blog.csdn.net/smile0198/article/details/25567541 刚開始用.记录 ...
- java发送163邮件
在服务挂掉后,可以采用发送邮件的方式来通知开发人员进行异常处理 import java.io.IOException; import java.util.Properties; import java ...
- Jenkins控制台显示乱码
方案: 解决控制台中文乱码问题: 点击左侧“系统管理”——右侧选择“系统设置”——“全局属性”,选择第一项:Environment variables,键值对列表,点击增加: 键:LANG 值:zh. ...
- camke使用例程
1 同文件夹直接编译 1 同文件夹直接编译 # cmake needs this line cmake_minimum_required(VERSION 2.8) # Define project n ...
- CentOS自带定时任务crontab
设置定时任务规则,crontab -e,如下示例为每一分钟执行一次脚本 在脚本中写入内容时需注意路径,可以写绝对路径,也可以按照如下形式 exepath=$(cd "$(dirname &q ...
- redis学习(四)——Hash数据类型
一.概述 我们可以将Redis中的Hash类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Age等. ...
- Mac支持ntfs格式的移动硬盘读写操作
转好文:https://blog.csdn.net/u013247765/article/details/77932144 本机环境: macOS Sierra version 10.12.6 201 ...