美文网首页
11.装饰器(注解)、深浅拷贝

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

作者: 哈哈大圣 | 来源:发表于2019-12-21 16:57 被阅读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]

相关文章

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

    一、装饰器 1). 装饰器概述 装饰器:Python中的代理模式的实现。 对其他函数进行增强。 原则:不修改被修饰...

  • python高级

    python高级:1、模块和包2、深浅拷贝3、回顾面向对象4、列表生成器5、迭代器6、装饰器7、函数高级8、正则表...

  • 开始

    装饰器与注解

  • Cpp8 运算符重载和深浅拷贝

    Cpp8 运算符重载和深浅拷贝 深浅拷贝 相同类型间可以直接拷贝 我们发现使用=直接赋值对象,编译器自动生成了op...

  • 高级编程(深浅拷贝,生成器,迭代器,装饰器)

    1.简答 说下对python深浅拷贝的理解。并有代码简单实现 ①只有一层深浅拷贝没区别: 都是 1、如果是可变,地...

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • 函数装饰器(Function Decorators)

    函数装饰器(Function Decorators) python中函数装饰器的使用和Java中注解类似, 直接在...

  • 理解Python装饰器

    理解Python装饰器 Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • Python—浅拷贝与深拷贝

    浅拷贝 深拷贝 深浅拷贝的作用

网友评论

      本文标题:11.装饰器(注解)、深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/trmgnctx.html