本节重点:

  • 掌握装饰器相关知识

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. 无法访问win8默认共享(如C$)解决办法

    可以使用此过程允许作为本地 Administrators 组的成员并使用密码身份验证登录的用户在会话过程中使用其管理权限.启动注册表编辑器.单击“开始”,在“开始搜索”框中键入 regedit,然后按 ...

  2. Volatile关键字以及线程的内存可见性问题

    一.Volatile关键字 作用: 当多个线程进行操作共享数据时,可以保证内存中的数据可见,即为一个线程对数据的修改对另外一个线程来说是可见的.相较于 synchronized 是一种较为轻量级的同步 ...

  3. Log4j编写

    来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记 ...

  4. CBCentralManagerDelegate Protocol 委托协议相关分析

    总体概述 CBCentralManagerDelegate 协议中定义了一系列方法列表,这些方法是委托对象必须要实现的方法(也有可选择的),当中央管理器的相应变化就会调用委托对象中实现的相应方法. M ...

  5. PHP中使用CURL模拟文件上传实例

    调用实例: 该方法将本地的E盘文件test.doc上传到接口服务器上的 uploadFile方法中,uploadFile会对上传的文件做进一步处理. 若你想自己对上传的文件做操作,将接口uploadF ...

  6. 添加 MyEclipse Persistence Tools 类库

    1).右键点击你的项目,然后选择Properties.2).在 Java Build Path 页面, 在 Libraries 面板下选择 Add Library….3).选择 MyEclipse L ...

  7. Linux内核SPI支持概述

    1. 什么是SPI? Serial Peripheral Interface是一种同步4线串口链路,用于连接传感器.内存和外设到微控制器.他是一种简单的事实标准,还不足以复杂到需要一份正式的规范.SP ...

  8. 1.在VC编译器下面为什么每个头文件以及源文件都要包含“stdAfx.h”,那么stdAfx.h中到底存放了什么,用来做什么?

    我们知道在windows平台下面很多的文件后缀名中都含有Afx,其实Afx是微软公司的一个技术研发团队名称,vc下的“stdAfx.h”和“stdAfx.cpp”文件就是有他们所研发出来的,为什么要这 ...

  9. LoadRunner11学习记录一 -- 安装

    一.首先是安装,相关的下载文件如下: 安装文件:http://pan.baidu.com/s/1ntH0Rd3 破解补丁:http://pan.baidu.com/s/1hq2HRsK 汉化包:htt ...

  10. MYSQl修改临时文件目录

    MSYQL在执行查询语句时报出以下错误: ERROR 3(HY000):Error writing file 'tmp/MY1yjZEI'(Errcode:28) 看了下/tmp所在目录的磁盘情况,发 ...