闭包跟装饰器

闭包的概念:一个完整的闭包必须满足以下三个条件:
  1.函数中嵌套一个函数
  2.外层函数返回内层函数的变量名
  3.内层函数对外部作用域有一个非全局的变量进行引用

例子:不带参数的闭包
def func():
num = 100
def count_book():
print("一共有{}本书".format(num))
return count_book

例子:带参数的闭包
def func(num):
def count_book():
print("一共有{}本书".format(num))
return count_book

res = func(100)
print(res.__closure__)

闭包的作用:实现数据的锁定,提高稳定性,把数据锁定在__closure__属性里面,__closure__属性外部的全局
变量不会进行锁定

 

装饰器

开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说说,对扩展是开放的,
而对修改是封闭的。

装饰器的作用:在不更改原功能函数内部代码,并且不改变调用方法的情况下为原函数添加新的功能

装饰器的应用场景:
  1.登录验证
  2.函数运行时间统计
  3.执行函数之前准备工作
  4.执行函数后清理功能

例子:

def login(func):
def fun():
user = input("请输入账号:")
password = input("请输入密码:")
if username == user and pwd == password:
func()
else:
print("账号密码错误")
return fun


@login
def index():
print("这是一个网站的首页")

index()


例子2:带参数的装饰器

def count_num(num):
def fun(a,b):
print("减法",a-b)
print("除法",a/b)
print("乘法",a*b)
num(a,b)
return fun


@count_num
def add_num(a,b):
print("相加",a+b)

add_num(2,2)


例子3:通用装饰器

def tong_yong(func):
def num(*args, **kwargs):
func(*args, **kwargs)

return num


例子4 :类装饰器

def tong_yong(func):
def num(*args, **kwargs):
print("测试类装饰器")
return func(*args, **kwargs)

return num


@tong_yong
class Cat:
def __init__(self):
pass
c = Cat()
print(c)

注意:类装饰器跟函数装饰器的唯一不同点就是,在装饰器的内层函数要加 retun 返回值


例子5:带参数的类装饰器

def tong_yong(func):
def num(*args, **kwargs):
print("测试类装饰器")
return func(*args, **kwargs)

return num


@tong_yong
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age

c = Cat("波斯猫",24)
print(c.name)

posted @ 2019-05-15 00:15  帅瓶子  阅读(135)  评论(0编辑  收藏  举报