《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记
看《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》 “定义一个属性可由用户修改的装饰器” 笔记相关推荐
- 定义一个属性_Python property属性
1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ###############class Foo: def ...
- PYTHON 类定义,属性,初始化
文章目录 PYTHON 类定义,属性,初始化 类定义 类的私有属性 类方法 类的初始化和析构 初始化 析构 PYTHON 类定义,属性,初始化 为了代码的编写方便简洁,引入了类的定义: 一般,使用 c ...
- 定义一个属性_CocosCreator脚本属性个性化定制——下拉列表属性、滑动条属性
一.声明属性 要声明属性,需要在 cc.Class 定义的 properties 字段中,填写属性名字和属性参数.在此处声明的属性在Cocos Creator编辑器属性检查器面板中可以读取和编辑.如下 ...
- python中定义类的关键字_在Python中,定义一个类使用什么关键字?
[多选题]技术应用的限制包括 [多选题]关于类和对象,下面说法正确的有? [判断题]温度越高,料液的粘度越小,扩散系数越大,可提高膜通量. [单选题]某企业有10台运货车,已知每台车每运行100小时平 ...
- Python开发基础总结(三)排序+迭代+生成器+装饰器
一.排序 1. list自己提供了排序的函数:sort. 2. sort的参数: a) cmp是一个比较函数,输入两个元素,比较大小,返回值为-1,0,1. b) key也是一 ...
- 【python】定义一个“曲调类”Note,value属性表示声音的高低 Note的三个子类分别表示高音、低音和中音定义一个“乐器类”Instrument具有play()方法
# 定义一个"曲调类"Note,value属性表示声音的高低 # a. Note的三个子类分别表示高音.低音和中音 # b. 定义一个"乐器类"Instrume ...
- 【python】定义一个人类Person: 定义一个方法say_hello(),可以向对方发出问候语“hello,my name is XXX” 有三个属性:名字、身高、体重
#定义一个人类Person: # a. 定义一个方法say_hello(),可以向对方发出问候语"hello,my name is XXX" # b. 有三个属性:名字.身高.体重 ...
- python如何对一个属性或方法进行封装_python 类、对象、方法、属性
在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...
- python actor_Python定义一个Actor任务
问题 你想定义跟actor模式中类似"actors"角色的任务 解决方案 actor模式是一种最古老的也是最简单的并行和分布式计算解决方案. 事实上,它天生的简单性是它如此受欢迎的 ...
最新文章
- 页面滚动事件和利用JS实现回到顶部效果
- Python 实现搭建本地IP代理池
- 完整的维纳滤波器Matlab源程序
- 说说C语言运算符的“优先级”与“结合性”
- iOS开发常用的RGB色值和宏
- Spring中拦截/和拦截/*的区别
- mysql数据库访问组件_mysql数据库访问组件
- 看看20万程序员怎么评论:前端程序员会不会被淘汰?
- 关于滤波电容、去耦电容、旁路电容作用
- Java字符串拼接“+”需要注意的问题
- DBUtils 学习使用
- 计算机四级网络工程师题目,计算机四级网络工程师题库
- mt950报文解析_MT700报文升级内容逐项解析
- flash cs4 无法调试
- 期刊评价查询+机器人领域期刊排名
- python的seek用法
- 文件内容检索工具-FileLocator
- 试述Linux内核启动过程,Linux内核启动过程和Bootloader(总述)
- URL缩短器:详细说明
- centos 安装flash插件