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

首頁 > 編程 > Python > 正文

Python類的動態修改的實例方法

2020-02-23 04:29:16
字體:
來源:轉載
供稿:網友

Python類的動態修改的實例方法

相信很多朋友在編程的時候都會想修改一下已經寫好的程序行為代碼,而最常見的方式就是通過子類來重寫父類的一些不滿足需求的方法。比如說下面這個例子。

class Dog:  def bark(self):    print 'Woof!' class Husky(Dog):  def bark(self)    print 'Howl!'

我們可以用上述方式來修改我們自己寫的代碼,但是我們應該怎么修改第三方代碼呢?當然,我們也可以自己編寫一個子類,調用子類的實例對象來實現修改,但是這樣可能會引入其他一系列問題。所以我們得想個辦法用我們自己的方法替換掉原來的對象方法,這就是本文接下來要介紹的“打補丁”的方式。

給類打補丁

如果我們想新增或是修改對象的方法的話,最簡單的方式莫過于給類打個補丁了。結合上面的例子,如果我們想給我們自己的 Dog 類寫一個新的 howl 方法的話,我們可以定義一個新的 howl 函數,像下面的代碼一樣把它添加到我們的類中:

def newbark(self):  print 'Wrooof!' def howl(self):  print 'Howl!' # Replace an existing methodDog.bark = newbark # Add a new methodDog.howl = howl

很簡單吧?但是這里有幾個問題需要我們注意。首先,被修改的類的所有實例中的方法都會被更新,所以更新后的方法不僅僅存在于新創建的對象中,之前創建的所有對象都會擁有更新之后的方法,除非只是新增而不是覆蓋掉原來的方法。第二,你修改或者新增的方法應當是與對象綁定的,所以方法的第一個參數應當是被調用的對象(在這里就是類的實例self)。

給類實例打補丁

單個對象也可以在不影響這個類的其他實例的情況下打補丁。但是還是有點小技巧的哦!先讓我們看看下面這個例子。

def herd(self, sheep):  self.run()  self.bark()  self.run() border_collie = Dog()border_collie.herd = herd

然后我們再試試調用新定義的方法:

border_collie.herd(sheep) TypeError: herd() takes exactly 2 arguments (1 given)The problem with the previous code is that the herd is not a bound method, just take a look at the following code: print border_collie.herd <function herd at 0xf9c5f0>

出錯啦!引發錯誤的原因就是被調用的對象并沒有作為第一個參數傳給我們寫的函數。當然我們可以自己把參數傳進去,但是在這個替換類方法的場景下并不奏效。解決這個問題的正確方案是用 type 這個模塊里的 MethodType 函數,我們可以看看下面的示例代碼:

import types border_collie = Dog()border_collie.herd = types.MethodType(herd, border_collie) print border_collie.herd<bound method ?.herd of <__main__.Dog instance at 0x23c9518>> border_collie.herd(sheep)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 张北县| 潼关县| 河南省| 合肥市| 视频| 长兴县| 柯坪县| 灵台县| 天峨县| 普定县| 济阳县| 长阳| 永安市| 菏泽市| 济宁市| 城步| 都安| 汉阴县| 牡丹江市| 昌江| 长宁县| 鲜城| 开江县| 西丰县| 花莲市| 华池县| 廉江市| 扶余县| 屏东市| 邳州市| 渑池县| 时尚| 阿拉善盟| 囊谦县| 漳州市| 康平县| 军事| 阿克陶县| 寻甸| 卢湾区| 北碚区|