装饰器
给现有模块增添新的小功能,不改变原有的代码和调用方式的情况下,增加新的功能
开放封闭原则:
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