首页 > 编程语言 > 详细

python装饰器

时间:2019-09-18 14:30:00      阅读:74      评论:0      收藏:0      [点我收藏+]

最近一直在学习python,关于装饰器这一点始始终搞的不是太明白在此记录一笔。

装饰器定义:装饰器用来给其它函数添加新功能,装饰其它函数。
装饰器原则:开放封闭原则,不能修改被修饰函数的源代码,且不能修改原有函数的调用方式。
装饰器生产场景:添加新的功能,已经上线的代码,在不修改原有的代码,以及原有函数的调用方式的情况下添加新的功能。

装饰器使用的知识点:
  1)高阶函数
  2)嵌套函数
  3)高阶函数 + 嵌套函数 = 装饰器

先介绍下高阶函数:
高阶函数就是把一个函数当作实参传入另外一个函数

例1:
def a():
print(‘my name is a‘)

def b(func):
print(func)
func()

调用:b(a)
输出:<function a at 0x0000024E3CB83400> #等于b函数中的print(func),打印函数a的内存地址
   my name is a #等于b函数中的func()此时的func已经被a函数替换,调用fucn()也就是在调用a()

例2:
def a():
print(‘my name is a‘)

def b(func):
print(func)
return func

调用:a = b(a) #a = func 在把b函数调用的a函数返回的内存地址,赋值给a
a() #现在的a有着函数a的内存地址加个小括号即可调用
输出:<function a at 0x000001C51CFC3400>
my name is a

嵌套函数:
嵌套函数是一个函数里用def在声明一个函数。
例:
# Author:Li Shuodzt
def a():
print(‘my name is a‘)
def b():
print("my name is b")
b()
a()

装饰器实例:
#这里在原有函数上添加了一个充值装饰器,一个登陆装饰器
def pay_money(func1):
def innet(*args,**kwargs):
money_num = input(‘请输入充值金额:‘)
print(‘充值成功,充值金额:‘,money_num)
func1(*args,**kwargs)
return innet

def login(func):
def inner(*args,**kwargs):
if acount[‘tag‘] is False:
username = input(‘user:‘)
password = input(‘password:‘)
if acount[‘username‘] == username and acount[‘password‘] == password:
print(‘login success.....‘)
acount[‘tag‘] = True
func(*args,**kwargs)
else:
print(‘username or password error....‘)
else:
print(‘已经登陆成功,验证通过‘)
func(*args,**kwargs)
return inner

@login
@pay_money
def jepan(vip_level):
if vip_level > 3:
print(‘目前你的vip等级大于三解锁本专区所有内容‘)
else:
print(‘---jepan专区,还有待解锁内容---‘)
jepan(4)

python装饰器

原文:https://www.cnblogs.com/lishuodzt/p/11541796.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!