开放-封闭原则:

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

装饰器:

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

例:在不更改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')

最新文章

  1. 使用GIT进行源码管理 —— 在VisualStudio中使用GIT
  2. Zookeeper操作
  3. 网页中多个图标在一张图片上,使用css将各图标显示
  4. js类型检测
  5. [linux]解决vsftpd 读取目录列表失败的问题
  6. javamail 收邮件并解析附件
  7. Excel Sheet Column Number
  8. ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象
  9. webpages框架使用@razor语法向js代码传递Json字符串
  10. [转]float,double和decimal类型
  11. UVa11526 H(n)
  12. Android 系统移植与驱动开发--第二章搭建Android环境核心步骤及心得
  13. 菜鸟的jQuery源码学习笔记(三)
  14. Network()
  15. windows进程清理脚本
  16. ExtJs Sencha Cmd创建项目以及编译项目
  17. [Leetcode]643. Maximum Average Subarray I
  18. 你电梯没了—OO第二单元作业思考
  19. Confluence 6 CSS 编辑快速入门
  20. python 处理 https链接 socket报错 链接https

热门文章

  1. 弱省胡策 Magic
  2. UVA437-The Tower of Babylon(动态规划基础)
  3. Python 带参数的装饰器 [2] 函数参数类型检查
  4. 一、springBoot简介与环境搭建
  5. How to get Pycharm
  6. (六) JavaScript 对象
  7. node.js读写文件
  8. sqlmap的简单使用
  9. 数组升序排序的方法Arrays.sort();的应用
  10. kafka模型理解