写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

封闭:已实现的功能代码块
开放:对扩展开发

#s2.py

def outer(func):
def inner():
print("log")
return func()
return inner @outer
def f1():
print("F1") @outer
def f2():
print("F2") @outer
def f100():
print("F100") #b1.py
import s2 s2.f1()
s2.f2()

一、装饰器流程剖析储备知识:

1、
def f1():
print('123') def f1():
print('456') f1() 2、
def f1():
print('123') def f2(xxx):
xxx() f2(f1)

 二、装饰器流程剖析:

def outer(func):
def inner():
print('before')
func()
print('after')
return inner @outer
def f1():
print("F1")

# @ + 函数名
# 功能
# 1. 自动执行outer函数并且将其下面的函数名f1当作参数传递
# 2. 将outer函数的返回值,重新复制给 f1

# 定义函数,为调用,函数内部不执行
# 函数名 》 代指函数

三、装饰器流程剖析之返回值:

# s1.py

def outer(func):
def inner():
print('before')
r = func()
print('after')
return r
return inner @outer
def f1():
print("F1")
return "nini" @outer
def f2():
print("F2") # b1.py
import s2 ret = s2.f1()
print("返回值",ret)

注:return 不能先执行,如果先执行后面的操作将不会操作,所以return放在最后。

四、装饰器流程剖析之参数:

# s1.py

def outer(func):
def inner(a):
print('before')
r = func(a)
print('after')
return r
return inner @outer
def f1(arg):
print(arg)
return "nini" # b1.py import s2 ret = s2.f1('faffa')
print("返回值",ret)

多参数传递,万能参数:

#s1.py

def outer(func):
def inner(*args,**kwargs):
print('before')
r = func(*args,**kwargs)
print('after')
return r
return inner @outer
def f1(arg):
print(arg)
return "nini" @outer
def f2(a1,a2):
print("F2") #b1.py
import s2 ret = s2.f1('faffa')
print("返回值",ret) s2.f2(11,22)

五、实例:用户管理程序:

装饰器最常用的功能之一是可以做权限的验证

LOGIN_USER = {"is_login":False}

def outer(func):
def inner(*args,**kwargs):
if LOGIN_USER['is_login']:
r = func()
return r
else:
print("请登录")
return inner @outer
def order():
print("欢迎%s登录" % LOGIN_USER['current_user']) @outer
def changepwd():
print("欢迎%s登录" % LOGIN_USER['current_user']) @outer
def manager():
print("欢迎%s登录" % LOGIN_USER['current_user']) def login(user,pwd):
if user == "alex" and pwd == "123":
LOGIN_USER['is_login'] = True
LOGIN_USER['current_user']=user
manager() def main():
while True:
inp = input("1,后台管理; 2,登录")
if inp == '1':
manager()
elif inp == '2':
username = input("请输入用户名")
pwd = input("请输入密码")
login(username,pwd) main()

六、双层装饰器实现用户登录和权限验证:

逻辑:多层装饰器,是从下往上一步步执行得。

#!/usr/bin/env python
# -*- coding: utf-8 -*- USER_INFO = {} def check_login(func):
def inner(*args,**kwargs):
if USER_INFO.get('is_login', None):
ret = func(*args,**kwargs)
return ret
else:
print('请登录')
return inner def check_admin(func):
def inner(*args,**kwargs):
if USER_INFO.get('is_login', None):
if USER_INFO.get('user_type', None) == 2:
ret = func(*args,**kwargs)
return ret
else:
print('无权限查看')
else:
print('请登录')
return inner @check_login
@check_admin
def index():
"""
管理员的功能
:return:
"""
print('Index') @check_login
def home():
"""
普通用户的功能
:return:
"""
print('home') def login():
user = input('请输入用户名:')
if user == 'admin':
USER_INFO['is_login'] = True
USER_INFO['user_type'] = 2
else:
USER_INFO['is_login'] = True
USER_INFO['user_type'] = 1 def main():
while True:
inp = input('1、登录;2、查看信息;3、超级管理员管理 \n >>> ')
if inp == "1":
login()
elif inp =='2':
home()
elif inp == '3':
index() main()

参考自:http://www.cnblogs.com/wupeiqi/articles/4980620.html

Python开发【第一篇】Python基础之装饰器的更多相关文章

  1. Python开发 第一篇 python的前世今生

    Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  2. Python【第一篇】基础介绍

    一.本节主要内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc文件 数据类型初识 数据运算 表达式if ...else语 ...

  3. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  4. Python开发——7.迭代器、生成器和装饰器

    一.迭代器 1.迭代器协议 (1)迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个StopIteration移除异常以中止迭代. (2)可迭代对象:实现了迭 ...

  5. Python开发第一篇

    Python 是什么? 首先他可能是比较好的一个编程开发语言!

  6. Python unittest第一篇:基础入门+命令行编译

    unittest单元测试框架最初受JUnit启发,与其他语言的主要单元测试框架具有相似的风格. 它支持测试自动化,支持开启或关闭某个测试,支持结合测试.另外它可以生成各个单元测试的报告.为了实现以上功 ...

  7. 图解Python 【第一篇】:Python基础1

    本节内容一览图 一.Python简介  Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间, ...

  8. 各位大佬Python的第一部分道基础题已经整理好了,希望大家面试的时候能用的上。

    Python的第一部分道基础题,希望大家面试的时候能用的上. 1.为什么学习Python? Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之一. 2.通过什么途 ...

  9. 《python开发技术详解》|百度网盘免费下载|Python开发入门篇

    <python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby  内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...

  10. python第一篇-------python介绍

    一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语言的编译器.Python这个名字,来自Guido所 ...

随机推荐

  1. css中内容生成器

    一,内容生成器:content 补充before和after伪类选择器: 1):将内容添加到某个选择器定义的单个或者多个元素的每一个实例之前或者之后 2)与before选择器配合使用(同理大家想下会不 ...

  2. 【Android车载系统 News | Tech 2】News 谷歌开发新车载系统!安卓Auto不是终点 2014-12-20

    Google在今年推出了车载安卓系统Android Auto,旨在为汽车提供娱乐.导航等功能.不过,Android Auto并不是终点,现在有消息报道,Google正在开发一个能够彻底取代汽车底层控制 ...

  3. HTML超出文本显示省略号...[text-overflow]

    需要对div或者span同时应用Css: text-overflow:ellipsis; white-space:nowrap; overflow:hidden; 即可实现所想要得到的溢出文本显示省略 ...

  4. The requested URL Not Found问题

    遇到这么一个问题: 最近刚转到linux下工作 在本地运行localhost下的thinkphp程序时,出现 一开始以为是权限问题,把目录以及文件权限都改为777依然不起作用 后来发现是rewrite ...

  5. javascript组件开发之基类继承实现

    上一篇文章大概的介绍了一下关于javascript组件的开发方式,这篇文章主要详细记一下基类的编写,这个基类主要是实现继承的功能 为什么要封装基类? 由于这次重构项目需要对各种组件进行封装,并且这些组 ...

  6. vs克隆新建团队项目

    团队资源——克隆,完成后打开: 在解决方案资源中,添加——新建项目——web——ASP.NET web应用程序——空的,并将其设为启动项目:

  7. 使用tornado的gen.coroutine进行异步编程

    在tornado3发布之后,强化了coroutine的概念,在异步编程中,替代了原来的gen.engine, 变成现在的gen.coroutine.这个装饰器本来就是为了简化在tornado中的异步编 ...

  8. 两种局部刷新UITableView的方法的使用条件

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //1.取消选 ...

  9. 【转】使用nmon监控suse或linux操作系统

    目的:使用nmon监控操作系统的内存,CPU等症状 nmon介绍:nmon 工具可以为AIX和Linux性能专家提供监视和分析性能数据的功能,其中包括CPU,内存,IO,free空间,页面空间页面速度 ...

  10. 【转】唱吧CEO陈华:创业四年,我积累的7点管理经验

    现象级产品“唱吧”至今拥有令人羡慕的用户数量,3亿.而这一切,却用了短短不到四年时间.唱吧团队如何应对越来越复杂的市场变化:怎样用人,才能不断激励新老员工做出更棒的业绩:CEO陈华又如何用“下大雪”模 ...