|
发表于 2022-10-28 12:30:50
|
显示全部楼层
本帖最后由 阿奇_o 于 2022-10-28 13:38 编辑
不好理解,那是因为你暂时还不够充分理解:“名可名非常名,道可道非常道”。。
eat = log(eat) 或 a = log(eat) # 这句我们所直接看到的都只是 名字而已 —— 左边的名字 绑定到了 右边名字被调用后返回的对象 —— 这才是这句赋值的本质。
那么,“道”,这里的“道”是什么? —— 逻辑 —— 是函数log的逻辑:log(eat) 返回的是 一个函数对象! (你可以将这个对象 赋值/绑定到 任何合法名字上)
细节是:赋值前,左边的eat 和 右边的eat , 不是同一个函数对象。赋值后,也不是。 简而言之,其实是 eat 被重新绑定(重新赋值了)。
其作用也不同,左边的eat是 将要被重新赋值的一个名字,右边是作为log的参数要传递的 名为eat的原函数对象!
那为什么要起一个易混淆的同样的名字呢?—— 因为装饰器语法使用时(@deco,@log),其实际上就是这种同名的、重新赋值的手段。
但借助这种语法的好处之一是:你可以很方便地随时随地使用同一个装饰器函数,如记录日志,只要在那个函数定义上加个@log("扣个帽子"即可),而不再需要上面那样重新赋值的原始步骤。
ps: 什么是“函数对象”? —— Python里的“一等对象”。—— 何为“一等对象”? “一等”在哪? 何为“对象”?…… 。。为啥又是这个本质又基础的老问题。。
ps2: 如果不想搞明白这些关键问题,一开始知道怎么用即可。毕竟装饰器类似“语法糖”(但实际不是),使用装饰器语法,本质只是为了更方便地使用 而已。
|
|