一、装饰器
1). 装饰器概述
- 装饰器:Python中的代理模式的实现。
- 对其他函数进行增强。
- 原则:不修改被修饰函数的源代码,不修改被修饰函数的调用方式
- 装饰器 = 高阶函数 + 函数嵌套 + 闭包
- 高阶函数(函数式编程):函数接受的参数是一个函数名,返回值为函数名,满足上述任意一个条件
- 函数嵌套:Python中的函数支持嵌套定义
- 函数闭包:被封装的变量对外不可见,变量的作用域保证这一点
- 被装饰的函数上添加
@装饰函数
注解即可
2). 简单装饰器:案例
"""实现封闭、可扩展,支持非固定参数的装饰器"""
statue = False # 两层
def login(func): # func即被增强的函数名
# *args, **kwargs这种形式的签名可以接受任意签名,
# 相当于将参数缓存下来,当执行原函数的时候,参数会进行匹配
def wrapper(*args, **kwargs):
global statue
if not statue:
name = input("usr>")
passward = input("pwd>")
if name == "lingting" and passward == "abc123":
statue = True
else:
print("用户名或密码错误")
return
if statue == True:
print("用户已登录", end="->")
return func(*args, **kwargs)
return wrapper
@login
def rihan(var):
print("%s 欢迎光临阿兹卡班" % var)
rihan("hehe")
3). 高级装饰器:案例
statue = False # 三层装饰器,例如用qq,微信,邮箱登录等
def login(*dargs, **dkwargs):
def wrapper(func):
def _wrapper(*args, **kwargs):
global statue
if not statue:
name = input("usr>")
passward = input("pwd>")
if name == "lingting" and passward == "abc123":
statue = True
else:
print("用户名或密码错误")
return
if statue == True:
print("用户已登录", end="->")
return func(*args, **kwargs)
return _wrapper
return wrapper
@login(1, 2, 3, 4, name="xxx") # 这里相当于将最外的执行了一遍
def rihan(var):
print("%s 欢迎光临阿兹卡班" % var)
rihan("hehe")
二、深浅拷贝
import copy
1). 浅拷贝
-
copy.copy
: 浅拷贝,只拷贝父对象,不会拷贝对象的内部的子对象。
- 将对象里面第一层元素的引用拷贝,对引用内容不拷贝。修改第二层及其以上引用的值不会发生变化
- 案例
s1 = [1, [1, 2, 3], 3, 4, 5]
s2 = s1.copy() # 浅拷贝
# 第一层的引用被拷贝,修改值不会相互影响
s2[0] = 0
print(s1)
print(s2)
# [1, 2, 3, 4, 5]
# [0, 2, 3, 4, 5]
# 第二层及其以上的引用相同,修改值会被跟着修改
s2[1][0] = 0
print(s1)
print(s2)
2). 深拷贝
-
copy.deepcopy
深拷贝,拷贝对象及其子对象
from copy import deepcopy
s1 = [1, [1, 2, 3], 3, 4, 5]
s2 = deepcopy(s1) # 浅拷贝
# 第一层的引用被拷贝,修改值不会相互影响
s2[0] = 0
print(s1)
print(s2)
# [1, [1, 2, 3], 3, 4, 5]
# [0, [1, 2, 3], 3, 4, 5]
# 第二层及其以上的引用相同,修改值不会相互影响
s2[1][0] = 0
print(s1)
print(s2)
# [1, [1, 2, 3], 3, 4, 5]
# [0, [0, 2, 3], 3, 4, 5]
网友评论