本节重点:

  • 掌握装饰器相关知识

python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。

装饰器扩展登录功能

import json

def auth_user(username, password):
user_dict = json.load(open("file/user1.txt", "r", encoding="gbk"))
if username in user_dict:
if password == user_dict[username]:
return True
return False login_status = False def login(fun):
def inner(*args, **kwargs):
global login_status
if not login_status:
username = input("用户名:").strip()
password = input("密码:").strip()
if auth_user(username, password):
login_status = True
else:
print("wrong username or password")
if login_status:
fun(*args, **kwargs) return inner @login
def dalu():
print(" 欢迎来到大陆电影 ".center(30, "-")) @login
def hongkong():
print(" 欢迎来到香港电影 ".center(30, "-")) @login
def rihan():
print(" 欢迎来到日韩电影 ".center(30, "-")) @login
def oumei():
print(" 欢迎来到欧美电影 ".center(30, "-")) action_dict = {
1: dalu,
2: hongkong,
3: rihan,
4: oumei
} if __name__ == '__main__':
while True:
choice = input("""--- 选择功能 ---
1.大陆电影
2.香港电影
3.日韩电影
4.欧美电影
choice:""").strip()
if choice.isdigit() and int(choice) in action_dict:
action_dict[int(choice)]()

可选择登录方式的装饰器(带参数的装饰器)

import json

def auth_user(auth_type, username, password):
auth_data = json.load(open("file/user2.txt", "r", encoding="gbk"))
user_list = auth_data[auth_type]
if username in user_list:
if password == user_list[username]:
return True
return False login_status = False def login(auth_type):
def auth(fun):
def inner(*args, **kwargs):
global login_status
nonlocal auth_type
if not login_status:
username = input("用户名:").strip()
password = input("密码:").strip()
if auth_user(auth_type, username=username, password=password):
login_status = True
else:
print("wrong username or password")
if login_status:
fun(*args, **kwargs)
return inner
return auth # @login("qq")
def dalu():
print(" 欢迎来到大陆电影 ".center(30, "-")) # @login("wechat")
def hongkong():
print(" 欢迎来到香港电影 ".center(30, "-")) # @login("qq")
def rihan():
print(" 欢迎来到日韩电影 ".center(30, "-")) # @login("qq")
def oumei():
print(" 欢迎来到欧美电影 ".center(30, "-")) action_dict = {
1: dalu,
2: hongkong,
3: rihan,
4: oumei
} if __name__ == '__main__':
while True:
choice = input("""--- 选择功能 ---
1.大陆电影
2.香港电影
3.日韩电影
4.欧美电影
choice:""").strip()
if choice.isdigit() and int(choice) in action_dict:
auth_type = None
if not login_status:
auth_type = input("登录方式").strip()
auth = login(auth_type)
inner = auth(action_dict[int(choice)])
inner()

python学习之路 六 :装饰器的更多相关文章

  1. Python学习之路7☞装饰器

    一:命名空间与作用域 1.1命名空间 局部命名空间: def foo(): x=1 def func(): pass 全局命名空间: import time class ClassName:pass ...

  2. Python学习之路6 - 装饰器

    装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能.原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器的知识储备: 1.函数即“变量” 2.高阶函 ...

  3. Python成长之路_装饰器

    一.初入装饰器 1.首先呢我们有这么一段代码,这段代码假设是N个业务部门的函数 def f1(aaa): print('我是F1业务') if aaa == 'f1': return 'ok' def ...

  4. python学习日记(函数--装饰器)

    楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...

  5. 【Python学习之二】装饰器

    装饰器 首先,给出装饰器的框架: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return ...

  6. python 学习笔记7(装饰器)

    闭包(closure)是函数式编程的重要的语法结构. 定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). def outer ...

  7. Python 学习笔记9(装饰器,decorator)

    31 装饰器 装饰器可以对一个函数.方法或者类进行加工,是一种高级的python语法. 装饰函数 接收一个可调用对象作为输入参数,并返回一个新的可调用对象. 把函数传递给装饰器,然后增加新的功能,返回 ...

  8. python学习之路-day4-装饰器&json&pickle

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 一.生成器 1.列表生成式 >>> L = [x * x for x in range(10 ...

  9. Python学习笔记九:装饰器,生成器,迭代器

    装饰器 本质是函数,装饰其他函数,为其他函数添加附加功能 原则: 1不修改原函数的源代码 2不修改原函数的调用方式 知识储备: 1函数即变量 使用门牌号的例子说明函数,调用方式与变量一致 2高阶函数 ...

随机推荐

  1. 调试正常,签名打包提示 "x应用未安装。"

    今天在工作的时候遇到一个奇葩的问题,开发一个新项目,然后在AS中调试运行都是一切正常.打包签名后,缺无法安装,提示"x应用未安装."如图所示. 网上找了好多方法,比如,签名的时候要 ...

  2. Django之ModelForm篇

    ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信 ...

  3. 80. Remove Duplicates from Sorted Array II (Array)

    Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For examp ...

  4. UITextView设置占位文字

    这里只介绍一种,这种方便扩展,可以占位文字颜色. 我们继承一个UITextView: #import <UIKit/UIKit.h> @interface MyTextView : UIT ...

  5. java工具jar包—Lombok

    如何引入 maven工程,直接引入lombok的jar依赖即可: <dependency> <groupId>org.projectlombok</groupId> ...

  6. java的static块及相关内容

    原文地址:http://blog.csdn.NET/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  7. EZOJ #227

    传送门 分析 我们发现第一段数和最后一段数对答案的贡献系数为1/-1,其余为0/2/-2 而且对于相邻两段不能系数均非0 于是可以dp 代码 #include<iostream> #inc ...

  8. Memcached在Windows下的配置和使用(转)

    出处:http://www.cnblogs.com/sunniest/p/4154209.html Memcached学习笔记---- 安装和配置 首先,下载Memcached相关文件. 打开控制台, ...

  9. ceph常用命令(转)

    原文:http://michaelkang.blog.51cto.com/1553154/1698287 一:ceph集群启动.重启.停止 1:ceph 命令的选项如下: 选项简写描述 --verbo ...

  10. Swift & Objc 在同一个项目中的使用

    在WWDC大会中发布了Swift让人眼前一亮.终于加了很多的现代编程语言该有的东西.很早年以前玩C#3.0+的时候这些差不多类似的 已经用的烂熟的东西终于一点一点的在看Swift Programmin ...