2018-03-22 13:38:37 554浏览
什么是Hook,就是在一个已有的方法上加入一些钩子,使得在该方法执行前或执行后另在做一些额外的处理,那么Hook技巧有什么作用以及我们为什么需要使用它呢,事实上如果一个项目在设计架构时考虑的足够充分,模块抽象的足够合理,设计之初为以后的扩展预留了足够的接口,那么我们完全可以不需要Hook技巧。但恰恰架构人员在项目设计之初往往没办法想的足够的深远,使得后续在扩展时深圳面临重构的痛苦,这时Hook技巧似乎可以为我们带来一记缓兵之计,通过对旧的架构进行加钩子来满足新的扩展需求。下面我们就来看看如果进行Hook处理,我们按照Hook的对象的层级来逐一介绍:
classSingleton(type):def__init__(cls,name,bases,dict):super(Singleton,cls).__init__(name,bases,dict)cls._instance=Nonedef__call__(cls,*args,**kw):ifcls._instanceisNone:cls._instance=super(Singleton,cls).__call__(*args,**kw)returncls._instanceclassMyClass(object):__metaclass__=Singleton
classC(object):a='abc'def__getattribute__(self,*args,**kwargs):print(__getattribute__()iscalled)returnobject.__getattribute__(self,*args,**kwargs)def__getattr__(self,name):print(__getattr__()iscalled)returnnamec=C()printc.a__getattribute__()iscalledabcprintc.aa__getattribute__()iscalled__getattr__()iscalledaa
classDesc(object):def__get__(self,instance,owner):print(__get__...)def__set__(self,instance,value):print('__set__...')classTestDesc(object):x=Desc()t=TestDesc()t.x__get__...
defsingleton(cls,*args,**kw):instances={}def_singleton():ifclsnotininstances:instances[cls]=cls(*args,**kw)returninstances[cls]return_singleton@singletonclassMyClass(object):a=1def__init__(self,x=0):self.x=x
defsomething(func):defwrap():printstartfunc()printendreturnwrap@somethingdeffunc():pass
defsomething(func):defwrap(*args,**kargv):printstartfunc(*args,**kargv)printendreturnwrap@somethingdeffunc(a,b):pass
defsomething(a,b):defnew_func(func):defwrap(*args,**kargv):printafunc(*args,**kargv)printbreturnwrapreturnnew_func@something(1,2)deffunc(a,b):pass
#Hookopen方法real_open=__builtins__.open__builtin__.open=my_open#Hookimport方法real_importer=__import____builtins__.__import__=my_importer
fromSomeOtherProduct.SomeModuleimportSomeClassdefspeak(self):return"ookookeeeeeeeee!"SomeClass.speak=speak
fromfunctoolsimportwrapsdefmy_dec(func):@wraps(func)defwrapped():print%siscalled%func.__name__returnfunc()returnwrapped@my_decdeffoo():pass
fromdecoratorimportdecorator@decoratordefwrap(f,*args,**kw): printstartf(*args,**kw)printend#这样wrap方法就变成了一个decorator@wrapdeffunc():printfunc
classtest(object):def__init__(self,func):self._func=funcdef__call__(self):printstartself._func()printend@testdeffunc():printfuncfunc()startfuncend
最后想要了解更多关于Python发展前景趋势,请关注扣丁学堂python培训官网、微信等平台,扣丁学堂IT职业在线学习教育平台为您提供最新的Python视频教程系统,通过千锋扣丁学堂金牌讲师在线录制的Python视频教程课程,让你快速掌握Python从入门到精通开发实战技能。扣丁学堂Python开发工程师技术交流群:279521237。
【关注微信公众号获取更多学习资料】