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

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

#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. 【Android 界面效果28】Android应用中五种常用的menu

    Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...

  2. 【Android 界面效果20】Android GradientDrawable类的详解,设置activity的背景颜色渐变效果

    看到这个例子的标题RoundRects,我的第一感觉是介绍RoundRectShape, 打开例子看了代码却是使用GradientDrawable来实现的. GradientDrawable 支持使用 ...

  3. iOS菜鸟总结1

    我从第一次接触OC,我觉得想要学好就必须有提前的知识的储备(比如c,java).这样就可更好了解面向对象的这一思想.学起来就不是很吃力了,本来OC就是比较难学的语言.工欲善其事,必先利其器,Xcode ...

  4. EasyUI设置复选框单选操作

    Html 代码: <td align="left" colspan="2">                    <input type=& ...

  5. Oracle 经典语法(五)

    1. 哪些部门的人数比20 号部门的人数多.SELECT DEPTNO,COUNT(*) FROM EMP     GROUP BY DEPTNO      HAVING COUNT(*) >  ...

  6. oneThink 数据库连接失败,总提示密码不对的解决办法

    oneThink的数据库配置文件是\Application\Common\Conf\config.php,按理来说,在这里修改数据库配置应该就可以重新连接,可是不管我怎么修改密码总是和我设置的不一致, ...

  7. Jquery 实现点击一个页面跳转后在另外一个页面显示指定位置

    <script> $(function(){ var isTarget = '<?php echo $_GET['target']; ?>'; if (isTarget != ...

  8. [转]关于position 的 static、relative、absolute、fixed、inherit

    本文转自:http://www.56770.com/faq/list/?id=410 position 有五个值:static.relative.absolute.fixed.inherit. sta ...

  9. CF 335B - Palindrome 区间DP

    335B - Palindrome 题目: 给出一个字符串(均有小写字母组成),如果有长度为100的回文子串,输出该子串.否则输出最长的回文子串. 分析: 虽然输入串的长度比较长,但是如果存在单个字母 ...

  10. GSS3 SPOJ 1716. Can you answer these queries III gss1的变形

    gss2调了一下午,至今还在wa... 我的做法是:对于询问按右区间排序,利用splay记录最右的位置.对于重复出现的,在splay中删掉之前出现的位置所在的节点,然后在splay中插入新的节点.对于 ...