2015.11.2: python tornado中如何给每个服务器请求动态加上装饰器?@Damnever 的回答
下面是正题。。。
***
动态添加实例属性的时候,这样:obj.a = 1
或setattr(obj, 'a', 1)
就可以了,so easy!
但是,动态添加方法的时候,问题来了。
这里动态的给一个实例添加一个方法:
调用一下,What the hell??
对于实例来说只是function
!连method
都不是…
这是什么情况我也不得而知…
参考 stackoverflow 上的最高票回答Adding a Method to an Existing Object。
对于一个类型(非实例)来说,它的属性都是unbound
的:
所以可以通过类型来动态添加一个方法,对于实例来说,它是bound
的,任何这个类型的实例都可以访问:
另一种方式是使用types.MethodType,这一种只对当前实例起作用:
types模块是 2.6 版之后new模块的替代(Python 3里已经不存在 new 模块了),所以new
里面的函数types
模块都有替代,如:
这里忍不住要看一下types
的源码,很简短,但是你懂得… 涉及到type
的,脑子里都是空白一片
这里还是不懂是什么机制,不过另一个答案Adding a Method to an Existing Object提到了descriptor protocol
。
描述器是属性, 实例方法, 静态方法, 类方法和 super 的背后的实现机制。
参考Descriptor HowTo Guide及译文Python描述器引导(翻译)。
另外动态的添加staticmethod
,classmethod
的方式:
话说我是怎么掉进这个坑的?其实只是为了搞一个奇葩的装饰器…
这也正是动态语言的强大之处: