国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Python開發(fā)中如何使用Hook技巧

2020-02-16 10:33:38
字體:
來源:轉載
供稿:網友

什么是Hook,就是在一個已有的方法上加入一些鉤子,使得在該方法執(zhí)行前或執(zhí)行后另在做一些額外的處理,那么Hook技巧有什么作用以及我們?yōu)槭裁葱枰褂盟兀聦嵣先绻粋€項目在設計架構時考慮的足夠充分,模塊抽象的足夠合理,設計之初為以后的擴展預留了足夠的接口,那么我們完全可以不需要Hook技巧。但恰恰架構人員在項目設計之初往往沒辦法想的足夠的深遠,使得后續(xù)在擴展時深圳面臨重構的痛苦,這時Hook技巧似乎可以為我們帶來一記緩兵之計,通過對舊的架構進行加鉤子來滿足新的擴展需求。

下面我們就來看看如果進行Hook處理,我們按照Hook的對象的層級來逐一介紹

對類進行Hook

也就是說我們得鉤子需要監(jiān)控到類的創(chuàng)建等操作,然后在此之前或之后做我們希望的操作

1、Hook類的創(chuàng)建

你可以在寫一個類的時候為其添加__metaclass__屬性

class Foo(Bar): __metaclass__ = something…

Python創(chuàng)建類的過程是這樣的:

Foo中有__metaclass__這個屬性嗎?如果是,Python會在內存中通過__metaclass__創(chuàng)建一個名字為Foo的類。如果Python沒有找到__metaclass__,它會繼續(xù)在Bar(父類)中尋找__metaclass__屬性,并嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會在模塊層次中去尋找__metaclass__,并嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會用內置的type來創(chuàng)建這個類對象。

所以我們需要在給__metaclass__屬性的值是一個能夠創(chuàng)建一個類的東西,即一個繼承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就是一個能夠創(chuàng)建類的對象,因為它繼承了type

也正因為此,我們可以在Singleton這個類中去監(jiān)控MyClass的創(chuàng)建過程

2、Hook實例屬性

這里我們需要操作的屬性是__getattribute__和__getattr__

object.__getattribute__(self, name) :無論訪問存在還是不存在的屬性都先訪問該方法

object.__getattr__(self, name) :當不存在__getattribute__方法或者引發(fā)了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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 麻城市| 林甸县| 县级市| 渑池县| 金湖县| 峡江县| 木兰县| 方城县| 青冈县| 凌云县| 榕江县| 改则县| 无极县| 文化| 长垣县| 塔河县| 扶沟县| 呈贡县| 江源县| 罗田县| 吴川市| 新绛县| 孟津县| 锡林浩特市| 若羌县| 田阳县| 菏泽市| 瓦房店市| 卓资县| 灵台县| 遂昌县| 夏津县| 庆安县| 会同县| 广德县| 丁青县| 涞水县| 同仁县| 阜阳市| 印江| 巢湖市|