第一阶段:函数装饰器和类装饰器的区别

关于装饰器的基础本文不在叙述,在python笔记里有解释本文只讲函数装饰器和类装饰器的区别

函数装饰器:就是用函数在当作装饰器来装饰

类装饰器:就是用类在当作装饰器来装饰

函数装饰器1.1

我们先看一个很简单的实例(用函数装饰器来装饰类)

def wrapper(cls):
def inner(*args,**kwargs):
print('开始执行')
c=cls()
c.test_A()
print('结束执行')

return inner

@wrapper
class test_A():
def __init__(self):
print('我是构造方法')
def test_A(self):
print('我是test_A')
if __name__ == '__main__':
test_A()

结果

 结果发现好像和函数装饰器来装饰函数并没有区别,简直就是一个样子(OK,恭喜你答对了确实一样,那接着看下一个)

类装饰器1.1

我们先看一个很简单的实例(用类装饰器来装饰函数)

class obj():
def __init__(self,func):
self.func=func
# 当把类当成装饰器时,类里一定要加__call__
def __call__(self, *args, **kwargs):
print(self.func.__name__)
a=self.test_B()
self.func(a)

print('执行结束')

def test_B(self):
print('md 才周四')
return '周四'
@obj
def test_A(canshu):
print(canshu)
print('我是test_A')
if __name__ == '__main__':
test_A()

结果

结论(what what 发生了什么 为什么要加call,并且把调用方法都写在了call里面,为什么为什么,哈哈哈哈 )

解释

我们知道语法糖后面如果是接受函数的话,那么函数装饰器是不用加call这个方法,只有类装饰器才会加,那么call和函数和类是不是有什么关系呢

🆗通过上面的引领,目前猜测是call可能和函数和类有一些联系,那么结果对不对呢,让我们先看下call的解释

 

 啊啊啊,这样子,也就是说加了call以后这个类就变成函数了,那么函数放在语法糖后面,有毛病吗,没毛病,哈哈哈哈,🆗解释完了这个,在解释下一个,为啥子要放在方法都写着call里呢

都知道啊

加了call以后 obj就是函数了,那么函数还能.函数吗(obj.test_B)这种,显然是不能的,所以只能把方法写在call里面了

哈哈哈哈

posted @ 2021-11-26 11:07  Tester-**  阅读(339)  评论(0编辑  收藏  举报