没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
什么是Hook,就是在一个已有的方法上加入一些钩子,使得在该方法执行前或执行后另在做一些额外的处理,那么Hook技巧有什么作用以及我们为什么需要使用它呢,事实上如果一个项目在设计架构时考虑的足够充分,模块抽象的足够合理,设计之初为以后的扩展预留了足够的接口,那么我们完全可以不需要Hook技巧。但恰恰架构人员在项目设计之初往往没办法想的足够的深远,使得后续在扩展时深圳面临重构的痛苦,这时Hook技巧似乎可以为我们带来一记缓兵之计,通过对旧的架构进行加钩子来满足新的扩展需求。 下面我们就来看看如果进行Hook处理,我们按照Hook的对象的层级来逐一介绍 对类进行Hook 也就是说我们得钩子需要监控
资源推荐
资源详情
资源评论
详解详解Python开发中如何使用开发中如何使用Hook技巧技巧
什么是Hook,就是在一个已有的方法上加入一些钩子,使得在该方法执行前或执行后另在做一些额外的处理,那么Hook技巧
有什么作用以及我们为什么需要使用它呢,事实上如果一个项目在设计架构时考虑的足够充分,模块抽象的足够合理,设计之
初为以后的扩展预留了足够的接口,那么我们完全可以不需要Hook技巧。但恰恰架构人员在项目设计之初往往没办法想的足
够的深远,使得后续在扩展时深圳面临重构的痛苦,这时Hook技巧似乎可以为我们带来一记缓兵之计,通过对旧的架构进行
加钩子来满足新的扩展需求。
下面我们就来看看如果进行Hook处理,我们按照Hook的对象的层级来逐一介绍
对类进行对类进行Hook
也就是说我们得钩子需要监控到类的创建等操作,然后在此之前或之后做我们希望的操作
1、、Hook类的创建类的创建
你可以在写一个类的时候为其添加__metaclass__属性
class Foo(Bar): __metaclass__ = something…
Python创建类的过程是这样的:
Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类。如果Python
没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。如果Python在
任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到
__metaclass__,Python就会用内置的type来创建这个类对象。
所以我们需要在给__metaclass__属性的值是一个能够创建一个类的东西,即一个继承type的类。
比如:
复制代码 代码如下:
class Singleton(type): def__init__(cls, name, bases, dict): super(Singleton, cls).__init__(name, bases, dict) cls._instance =
None def__call__(cls, *args, **kw): if cls._instance is None: cls._instance = super(Singleton, cls).__call__(*args, **kw) return
cls._instanceclass MyClass(object): __metaclass__ = Singleton
Singleton就是一个能够创建类的对象,因为它继承了type
也正因为此,我们可以在Singleton这个类中去监控MyClass的创建过程
2、、Hook实例属性实例属性
这里我们需要操作的属性是__getattribute__和__getattr__
object.__getattribute__(self, name) :无论访问存在还是不存在的属性都先访问该方法
object.__getattr__(self, name) :当不存在__getattribute__方法或者引发了AttributeError异常时访问该方法
复制代码 代码如下:
class C(object): a = ‘abc’ def __getattribute__(self, *args, **kwargs): print(__getattribute__() is called) return
object.__getattribute__(self, *args, **kwargs) def __getattr__(self, name): print(__getattr__() is called) return namec =
C()print c.a__getattribute__() is calledabcprint c.aa__getattribute__() is called__getattr__() is calledaa
可以看到,访问已有属性a时,__getattribute__被调用,访问未定义的属性aa时__getattribute__先被调用,接着__getattr__
被调用
3、、Hook类属性类属性
python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有 __get__(),
__set__(), 和__delete__()。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符。
复制代码 代码如下:
class Desc(object): def __get__(self, instance, owner):print(__get__…) def __set__(self, instance,
value):print(‘__set__…’)class TestDesc(object): x = Desc()t = TestDesc()t.x__get__…
– self: Desc的实例对象,其实就是TestDesc的属性x
– instance: TestDesc的实例对象,其实就是t
– owner: 即谁拥有这些东西,当然是 TestDesc这个类,它是最高统治者,其他的一些都是包含在它的内部或者由它生出来的
资源评论
weixin_38699726
- 粉丝: 5
- 资源: 927
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功