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

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

#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. 如何使用 SQL Developer 导出数据

    完成此方法文档后,您应该能够了解: 如何使用 SQL Developer 将数据导出为各种文件格式 如何导出模式中的对象定义 目录 1. 简介 2. 软件要求 3. 导出数据 4. 导出对象定义 5. ...

  2. Java为什么只能单继承?

    就是因为C++里多重继承功能强大但是容易出错,Java才给取消掉了.如果,A和B都继承于C,再写个D继承A和B.那么C里面有个方法,A和B继承过去后都进行了覆盖,那么D到底是该继承A里面的版本呢还是B ...

  3. AngularJs指令(一)

    AngularJs应用现在越来越流行了,谷歌都与微软合作支持AngularJS2.0,这是要逆天了,说明AngularJs将来大势所趋.最近想跳槽,又重新拾起了AngluarJs(之前由于缺少项目应用 ...

  4. POJ 2236 Wireless Network (并查集)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 18066   Accepted: 761 ...

  5. 转: app端数据库(性能高) realm (ios, android 均支持)

    转:  http://ios.jobbole.com/85041/ 移动端数据库新王者:realm 2016/05/14 · iOS开发 · 数据库 分享到:0 原文出处: 没故事的卓同学(@没故事的 ...

  6. vs2013发布时: sgen.exe 已退出 代码为 1

    出现这个错的时候,有查网上的.自己也亲试了一下,注意两个地方就行. 红色框里设成这样的值就OK了!

  7. 跟我一起学习ASP.NET 4.5 MVC4.0(四)(转)

    前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是权限验证,即AuthorizeAttribute.这个可以使用在控制器Controller上,也可以使用在Action ...

  8. (Android)处理图片成圆形

    Android将一张Bitmap处理成圆形是十分常见的,经常见的场合就是作为用户头像,我们可以Canvas来辅助实现这个功能,代码如下 public static Bitmap toRoundCorn ...

  9. 22----2013.06.29---HTML--html介绍.超链接和图片,表格,表单,表单标签,meta,复习当天内容

    01 HTML HTML :Hypertext Markup Language   超文本标记语言(类似于 裸奔的人.) 作用:向用户展示信息. CSS: Cascading 层叠样式表(类似于 人的 ...

  10. 我的一点关于把WndProc指向类的成员函数的看法

    转载请注明来源:http://www.cnblogs.com/xuesongshu/ 我以前经常考虑使用WNDCLASS.CreateThread之类的Windows API时如何在类里面调用,传入函 ...