装饰器复习加补充

装饰器

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

开放封闭原则:

  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

 

posted @ 2023-11-15 17:27  别管鱼油我了  阅读(3)  评论(0编辑  收藏  举报