11.装饰器(注解)、深浅拷贝

2019-12-21  本文已影响0人  哈哈大圣

一、装饰器

1). 装饰器概述

  1. 装饰器:Python中的代理模式的实现。
  2. 对其他函数进行增强。
  3. 原则:不修改被修饰函数的源代码,不修改被修饰函数的调用方式
  4. 装饰器 = 高阶函数 + 函数嵌套 + 闭包
    • 高阶函数(函数式编程):函数接受的参数是一个函数名,返回值为函数名,满足上述任意一个条件
    • 函数嵌套:Python中的函数支持嵌套定义
    • 函数闭包:被封装的变量对外不可见,变量的作用域保证这一点
  5. 被装饰的函数上添加@装饰函数注解即可

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). 浅拷贝

  1. copy.copy: 浅拷贝,只拷贝父对象,不会拷贝对象的内部的子对象。
  2. 将对象里面第一层元素的引用拷贝,对引用内容不拷贝。修改第二层及其以上引用的值不会发生变化
  3. 案例
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). 深拷贝

  1. 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]
上一篇 下一篇

猜你喜欢

热点阅读