首页 > 其他分享 >装饰器复习加补充

装饰器复习加补充

时间:2023-11-15 17:34:29浏览次数:35  
标签:__ name 补充 res Person 装饰 def 复习

装饰器

给现有模块增添新的小功能,不改变原有的代码和调用方式的情况下,增加新的功能

开放封闭原则:

  1、对扩展开放,在有新的需求和变划时,可以对现有的代码进行扩展

  2、对修改封闭,类设计完成后,就可以独立其工作,不要对类尽做修改

if __name__ == '__main__':的作用
一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在 if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。

当在当前的脚本中运行,打印__name__就是__main__,如果将当前脚本导入到别的文件中,打印__name__就是文件名。

类装饰器

类装饰器的实现调用了类里面的__call__函数

通过__init__()方法初始化类

通过__call__()方法调用真正的装饰方法

 

加类上的装饰器,如果装饰器什么都不写,类用起来跟之前一样

如果装饰器中对对象进行一些操作,只要加了这个装饰器,所有类产生的对象,都会走装饰器inner内的操作

# def auth(func):
#     def inner(*args, **kwargs):
#         res = func(*args, **kwargs)
#         # res 是 Person类的对象
#         res.name = '彭于晏'
#         res.age=99
#         return res
#
#     return inner
#
#
# @auth  # Person=auth(Person)--->以后Person就变成了 inner
# class Person():
#     def __init__(self, name):
#         self.name = name
#
#
# print('------', type(Person))  # Person就变成了 inner,不影响后续使用
#
# p = Person('lqz')
# p1=Person('sdasfsd')
# print(p.name)   #彭于晏
# print(p.age)  #99

类做装饰器

# class Auth():
#     def __init__(self, func):
#         self.func = func
#
#     def __call__(self, *args, **kwargs):
#         print('我执行了')
#         res = self.func(*args, **kwargs)
#         print('执行完了')
#         return res
#
#
# @Auth  # add=Auth(add)--->后续 add 以后就是Auth的对象了--》add(1,2)---》 Auth类对象()
# def add(a, b):
#     return a + b
#
#
# res = add(1, 3)  # Auth的对象加括号---》会触发类的————__call__
# print(res)

类装饰器装饰类

class Auth():
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print('我执行了')
        res = self.func(*args, **kwargs)
        print('执行完了')
        return res


@Auth  # Person=Auth(Person)
class Person:
    pass


p = Person()  # Person()---->本质是谁? Auth(Person)()---》触发Auth的__call__

 

1、给类加装饰器,在装饰器中,可以控制对象的产生过程,以及修改对象(给对象加属性或者方法),增强了对象

2、类作为装饰器,必须要写__init__和__call__,原来装饰器在执行被装饰函数之前和之后的代码,都写在__call__中

3、类作为装饰器也可以装饰类

 

有参装饰器

额外为被装饰的函数传参数

有参装饰器:之前的装饰器都不加括号,如果有参装饰器,装饰器加括号

 

在装饰器内部,有些动态的参数,是通过传参传过来的,就可以使用有参装饰器

def auth(name):
    def outter(func):
        def inner(*args, **kwargs):
            
            res = func(*args, **kwargs)
            return res
        return inner
    return outter

name='彭于晏'

@auth(name)  # add=auth('lqz')(add)
def add(a,b):
    return a+b

 

标签:__,name,补充,res,Person,装饰,def,复习
From: https://www.cnblogs.com/YeeQX/p/17834350.html

相关文章

  • python中可变参数与装饰器的例子
    python的可变参数方法定义#*args是可以传list类型的可变参数,**kwargs是可以传dict的可变参数defwrapper(*args,**kwargs):使用示例deffoo(*args,**kwargs):print'args=',argsprint'kwargs=',kwargsprint'-------------------------------------......
  • 知识点复习-每日一读
    1.编译:编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(Compile)。(C程序->二进制)2.链接:链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件,编译只是将我们自己写的代码......
  • 学习随笔(设计模式:装饰模式)
    内容今天学习了新的设计模式,装饰模式。装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。收获1.当我们在设计软件时,考虑使用基类和派生类的时候,就可以考虑是否可以使用装饰模式,因为装饰模式比生成子类更加灵活2.当我们对一个已有的类添......
  • (十七)C#编程基础复习——数组
    和其他编程语言一样C#也支持数组,数据是一个用来存储相同类型数据的、固定大小的、具有连续内存位置的顺序集合。数组中的每个元素都对应一个索引值,索引从0开始依次递增,我们可以通过索引来访问数据中的指定元素。假如我们要存储100名学生的分数,若使用普通变量的话可能需要定义100......
  • (十六)C#编程基础复习——可空类型
    一、可空类型在C#1.X的版本中,一个值类型的变量是不可以被赋值为null(空值)的,否则会产生异常。而在C#2.0中,新增了一个nullable类型,可以使用nullable类型定义包含null值的数据,例如,你可以在nullable<Int32>(可为空的int32类型)类型的变量中存储-2147483648到2147483647之间的任何只或......
  • C/C++知识补充
    运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符运算符描述实例+把两个操作数相加A+B将得到30-从第一个操作数中减去第二个操作数A-B将得到-10*把两个操作数相乘A*B将得到200/分子除以分母B/A将得到......
  • (十五)C#编程基础复习——值传递、引用传递、输出传递
    通过前面的学习,我们了解了在调用带有参数的函数时,需要将参数传递给函数。在介绍这几种传递方式之前,我们先来介绍一下形式参数(形参)和实际参数(实参)这两个概念:形式参数:在定义函数阶段参数列表中定义的参数称之为形式参数,简称形参,可以将它看做变量的名称,它没有具体的值,只是用来接收......
  • 随笔 复习 连接池 线程池
    连接池实现思路classConnectPool{public:ConnectPool(intnumber){for(inti=0;i<=number;i++){intfd=socket(); //创建通信的fdconect(); //连接服务器m_list.push(fd);//往容器中存储链接......
  • nlp期末概念复习
    概率模型隐马尔科夫,viterbi贝叶斯平滑技术:处理数据矩阵稀疏问题,事件可能在样本库中未出现拉普拉斯平滑Good-Turing平滑词性标注词性标注:给定一个词序列,确定每个词的词性信息来源:词本身,上下文马尔科夫词性标注器,一阶马尔科夫链基于转换的词性标注:让计算机学习修正......
  • 对数据类型进行补充——逻辑类型及运算
    一.关于stdbool.h(布尔类型文件)(1)C语言标准(C89)没有定义布尔类型,使用true/false会出现错误;(2)头文件:#include<stdbool.h>;(3)输出仍然为整数,而不会是true/false的值;二.逻辑运算(对逻辑量进行运算,结果只有0或1)——————注明:逻辑量是关系运算或逻辑运算的结果(1)三种运算符及其......