Python Decorator的设计模式实例分析


本篇内容介绍了“PythonDecorator的设计模式实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!设计模式中经常提到的代理模式、装饰模式,这两种叫法实际上是说的同一件事,只是侧重点有所不同而已。这两者都是通过在原有对象的基础上封装一层对象,通过调用封装后的对象而不是原来的对象来实现代理/装饰的目的。例如:(以Java为例)在这个例子中CountProxy是对CountImpl的封装。使用者通过CountProxy.queryCount方法来调用CountImpl.queryCount方法,这被称为代理,即CountProxy是代理类,CountImpl是被代理类。在CountProxy.queryCount方法中,可以在CountImpl.queryCount方法调用之前和之后添加一些额外的操作,被称为装饰,即CountProxy是装饰类,CountImpl是被装饰类。如果强调通过CountProxyCountImpl进行代理的作用,则称为代理模式;如果强调通过CountProxyCountImpl增加额外的操作,则称为装饰模式;不论是哪种称呼,其本质都在于对原有对象的封装。其封装的目的在于增强所封装对象的功能或管理所封装的对象。从上面的例子也可以发现,代理/封装所围绕的核心是可调用对象(比如函数)。Python中的可调用对象包括函数、方法、实现了__call__方法的类。Python中的函数也是对象,可以作为高阶函数的参数传入或返回值返回。因此,当代理/装饰的对象是函数时,可以使用高阶函数来对某个函数进行封装。例如:但是,这个例子中,query_count函数作为参数传入query_count_proxy函数中,并在query_count_proxy函数中被调用,其结果作为返回值返回。这就完成了代理的功能,同时,在调用query_count函数的前后,我们还增加了装饰代码。但是,query_count_proxy的函数参数与query_count不一样了,理想的代理应该保持接口一致才对。为了保持一致,我们可以利用高阶函数可以返回函数的特点来完成:修改后的例子,query_count_proxy仅负责接受被代理的函数query_count作为参数,同时,返回一个函数对象wrapper作为返回值,真正的封装动作在wrapper这个函数中完成。此时,如果调用query_count_proxy(query_count)就得到了wrapper函数对象,则,执行query_count_proxy(query_count)('Lee', 20)就相当于执行了wrapper('Lee', 20)。但是可以看到,query_count_proxy(query_count)('Lee', 20)这种使用方法,仍然不能保证一致。为了保持一致,我们需要利用Python中对象与其名称可以动态绑定的特点。不使用query_count_proxy(quer_count)('Lee', 20)来调用代理函数,而是使用下面两句:执行query_count_proxy(query_count)生成wrapper函数对象,将这个对象通过query_count = query_count_proxy(query_count)绑定到query_count这个名字上来,这样执行query_count('Lee', 20)时,其实执行的是免费云主机域名wrapper('Lee', 20)。这么做的结果就是:使用代理时调用query_count('Lee', 20)与不使用代理时调用query_count('Lee', 20)对使用者而言保持不变,不用改变代码,但是在真正执行时,使用的是代理/装饰后的函数。这里,基本利用Python的高阶函数及名称绑定完成了代理/装饰的功能。对,就是query_count = query_count_proxy(query_count),因为这句既不简洁,又属于重复工作。Python为我们提供了语法糖来完成这类的tedious work。方法就是:query_count = query_count_proxy(query_count)就等同于在定义query_count函数的时候,在其前面加上@query_count_proxy。Python看到这样的语法,就会自动的执行query_count = query_count_proxy(query_count)进行name rebinding“PythonDecorator的设计模式实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: thinkphp找不到指定模块如何解决

这篇文章主要介绍“thinkphp找不到指定模块如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“thinkphp找不到指定模块如何解决”文章能帮助大家解决问题。 thinkphp找不到指定模块的解决办法:1、在c…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 03/18 20:51
Next 03/18 20:53

相关推荐