装饰器参数
上面介绍的装饰器中的闭包和被装饰的函数的参数是相同的。

其实只要保证闭包和被装饰的函数中的参数保持一致就行了。其中一个概念是可变参数,其实就是一个带星号(*)的变量名,它的本质是使用一个元组来存储数量不确定的参数。

如果闭包也就是装饰器的内层函数和被装饰的函数之间的参数无法匹配的话是不能对被装饰的函数进行装饰的,有兴趣的可以试一下。
多个装饰器
关于被装饰的函数,它可以有多个装饰器,像一幅白纸,可以被红色装饰,也同时可以被绿色装饰,装饰的顺序不同可能会有不同的效果,例子可能不是很恰当,但差不多就是这么回事。
和白纸一样,多个装饰器的情况,要注意指定顺序,只要细心应该没什么问题。

装饰器解除
如果,很不幸的遇见一个善变的老板或者产品。你可能还会有恼火的事情。比如你刚加好装饰器,他又告诉你之前的代码就可以了,新加的功能又不要了。也就是说之前的函数就可以了,不需要装饰了。这是你有句什么话要讲来着。
怎么办呢?
删了写好的装饰器。
万一之后又要呢?毕竟产品和老板都是善变的生物。
这时候只需要接触装饰器就好了,就能使用函数被装饰之前的功能了。
使用函数名调用其__wrapped__属性得到原来的被装饰之前的函数。

关于被装饰的函数中的信息,在被包装之后就丢失了,比如函数名,文档字符串,参数等等。
但是我们使用@wrap注解可以保存这些信息,该注解必传的参数书函数名。我们使用这个注解主要就是为了获取这些信息,在这里是为了获取被装饰前的函数。

好了,大概就是这样。
Then,that’s all,thank you。
网友评论