看《Python cookbook》的时候,第9.5部分,“定义一个属性可由用户修改的装饰器”,有个装饰器理解起来花了一些时间,做个笔记免得二刷这本书的时候忘了

完整代码:https://github.com/blackmatrix7/python-learning/blob/master/python_cookbook/chapter_9/section_5/attach_wrapper.py

书中的装饰器(书中称之为访问器函数)

def attach_wrapper(obj, func=None):if func is None:return partial(attach_wrapper, obj)setattr(obj, func.__name__, func)return func

这个访问器函数,接受两个参数,obj是需要处理的对象,func是被装饰的函数。实现的效果是将被装饰的对象,附加到obj中,使obj这个对象具有func这个方法。

当访问器函数,执行到func is None时,实际上是执行的是attach_wrapper(obj=wrapper),刚刚将需要处理的对象obj传入。

        @attach_wrapper(wrapper)def set_message(newmsg):print('set message')nonlocal logmsglogmsg = newmsg

如果对装饰器有一定理解,上面的set_message的装饰器,实际上等于下面的方法

attach_wrapper(wrapper)(set_message)

对上面这个语句,还可以继续拆分

访问器函数中判断,当func为None时,返回一个偏函数 return partial(attach_wrapper, obj)

这个偏函数实际上是生成了一个包装器,包装器本身接受被装饰的函数。

所以我们得到一个偏函数,也是包装器

partial_func = partial(attach_wrapper, obj)attach_wrapper(wrapper) == partial_func

因为偏函数已经带有一个obj参数, 所以再次调用时,执行 setattr(obj, func.__name__, func)

此时给装饰器传入的对象,附加上被装饰的函数

partial_func(set_message)

如果还不明白,可以看下面的装饰器。

这个装饰器的功能,等价于上面的访问器函数

def my_attach_wrapper(obj):"""如果这样写就非常容易理解了,把这个方法附加到被传入的对象中:param obj: :return: """def _my_attach_wrapper(func):setattr(obj, func.__name__, func)return _my_attach_wrapper

转载于:https://www.cnblogs.com/blackmatrix/p/6850762.html

《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记相关推荐

  1. 定义一个属性_Python property属性

    1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ###############class Foo: def ...

  2. PYTHON 类定义,属性,初始化

    文章目录 PYTHON 类定义,属性,初始化 类定义 类的私有属性 类方法 类的初始化和析构 初始化 析构 PYTHON 类定义,属性,初始化 为了代码的编写方便简洁,引入了类的定义: 一般,使用 c ...

  3. 定义一个属性_CocosCreator脚本属性个性化定制——下拉列表属性、滑动条属性

    一.声明属性 要声明属性,需要在 cc.Class 定义的 properties 字段中,填写属性名字和属性参数.在此处声明的属性在Cocos Creator编辑器属性检查器面板中可以读取和编辑.如下 ...

  4. python中定义类的关键字_在Python中,定义一个类使用什么关键字?

    [多选题]技术应用的限制包括 [多选题]关于类和对象,下面说法正确的有? [判断题]温度越高,料液的粘度越小,扩散系数越大,可提高膜通量. [单选题]某企业有10台运货车,已知每台车每运行100小时平 ...

  5. Python开发基础总结(三)排序+迭代+生成器+装饰器

    一.排序 1.    list自己提供了排序的函数:sort. 2.    sort的参数: a)    cmp是一个比较函数,输入两个元素,比较大小,返回值为-1,0,1. b)    key也是一 ...

  6. 【python】定义一个“曲调类”Note,value属性表示声音的高低 Note的三个子类分别表示高音、低音和中音定义一个“乐器类”Instrument具有play()方法

    # 定义一个"曲调类"Note,value属性表示声音的高低 # a. Note的三个子类分别表示高音.低音和中音 # b. 定义一个"乐器类"Instrume ...

  7. 【python】定义一个人类Person: 定义一个方法say_hello(),可以向对方发出问候语“hello,my name is XXX” 有三个属性:名字、身高、体重

    #定义一个人类Person: # a. 定义一个方法say_hello(),可以向对方发出问候语"hello,my name is XXX" # b. 有三个属性:名字.身高.体重 ...

  8. python如何对一个属性或方法进行封装_python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  9. python actor_Python定义一个Actor任务

    问题 你想定义跟actor模式中类似"actors"角色的任务 解决方案 actor模式是一种最古老的也是最简单的并行和分布式计算解决方案. 事实上,它天生的简单性是它如此受欢迎的 ...

最新文章

  1. 页面滚动事件和利用JS实现回到顶部效果
  2. Python 实现搭建本地IP代理池
  3. 完整的维纳滤波器Matlab源程序
  4. 说说C语言运算符的“优先级”与“结合性”
  5. iOS开发常用的RGB色值和宏
  6. Spring中拦截/和拦截/*的区别
  7. mysql数据库访问组件_mysql数据库访问组件
  8. 看看20万程序员怎么评论:前端程序员会不会被淘汰?
  9. 关于滤波电容、去耦电容、旁路电容作用
  10. Java字符串拼接“+”需要注意的问题
  11. DBUtils 学习使用
  12. 计算机四级网络工程师题目,计算机四级网络工程师题库
  13. mt950报文解析_MT700报文升级内容逐项解析
  14. flash cs4 无法调试
  15. 期刊评价查询+机器人领域期刊排名
  16. python的seek用法
  17. 文件内容检索工具-FileLocator
  18. 试述Linux内核启动过程,Linux内核启动过程和Bootloader(总述)
  19. URL缩短器:详细说明
  20. centos 安装flash插件

热门文章

  1. 上海某马培训软件测试工程师第01期就业班课程
  2. MySQL存储布类型的值_mysql 字段存储类型
  3. DSP Flash运行代码
  4. Direct3D Devices
  5. WPF.UIShell UIFramework之自定义窗口的深度技术
  6. Ubuntu 装搜过输入法后桌面黑屏
  7. js汉字转换拼音(网上找的js库)
  8. 2246xt u盘开卡详细教程_联想y700-15笔记本如何使用bios设置u盘启动【详细步骤】...
  9. 华为CaaS开放平台产品宣传片
  10. 51nod3116 松鼠的新家