本节重点:

  • 掌握装饰器相关知识

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. 【原】Coursera—Andrew Ng机器学习—Week 6 习题—Advice for applying machine learning

    [1] 诊断的作用 [2]过拟合 [3] [4] 高偏差bias,欠拟合underfitting 高方差variance,过拟合overfitting [5]参数λ Answer:  λ太大,则参数都 ...

  2. aop中的顾问

    通知只能指定织入的时间点,目标方法之前,之后,环绕,还是异常时. 要想指定切入点就要使用顾问

  3. hibernate 反向生实体类 and 为什么老是多一个id

    hibernate 反向生实体类 and 为什么老是多一个id 2017年04月01日 20:32:51 阅读数:548

  4. 微信OAuth2.0网页授权php示例

    1.配置授权回调页面域名,如 www.aaa.com 2.模拟公众号的第三方网页,fn_system.php <?php if(empty($_SESSION['user'])){ header ...

  5. 270. Closest Binary Search Tree Value 二叉搜索树中,距离目标值最近的节点

    [抄题]: Given a non-empty binary search tree and a target value, find the value in the BST that is clo ...

  6. 一张图记住TCP/IP通讯中的IP地址配置

    TCP/IP通讯情景: 用网线将计算机A(服务器Server)和计算机B(Client)连接起来.程序代码在计算机A中,计算机B中安装有TCP/IP通讯助手. (图中屏幕大的是计算机A,屏幕小的笔记本 ...

  7. List 组件简单示例及其onItemsDisclosure点击事件

    来自<sencha touch权威指南>第9章,276页开始 ------------------------------------------------- app.js代码如下: E ...

  8. 黑客攻击 UVa11825

    http://www.cnblogs.com/acm-bingzi/p/3272898.html Hackers’ Crackdown Miracle Corporations has a numbe ...

  9. linux换行PHP_EOL

    $file = 'log.txt';file_put_contents($file,$param.PHP_EOL,FILE_APPEND);

  10. C# 四舍五入的理解

    Math.Round(45.367,2)     //Returns   45.37 Math.Round(45.365,2)     //Returns   45.36 C#中的Round()不是我 ...