最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python類的動(dòng)態(tài)修改的實(shí)例方法

 更新時(shí)間:2017年03月24日 14:17:05   作者:平和的心  
這篇文章主要介紹了Python類的動(dòng)態(tài)修改的實(shí)例方法的相關(guān)資料,需要的朋友可以參考下

Python類的動(dòng)態(tài)修改的實(shí)例方法

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

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

我們可以用上述方式來修改我們自己寫的代碼,但是我們應(yīng)該怎么修改第三方代碼呢?當(dāng)然,我們也可以自己編寫一個(gè)子類,調(diào)用子類的實(shí)例對(duì)象來實(shí)現(xiàn)修改,但是這樣可能會(huì)引入其他一系列問題。所以我們得想個(gè)辦法用我們自己的方法替換掉原來的對(duì)象方法,這就是本文接下來要介紹的“打補(bǔ)丁”的方式。

給類打補(bǔ)丁

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

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

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

給類實(shí)例打補(bǔ)丁

單個(gè)對(duì)象也可以在不影響這個(gè)類的其他實(shí)例的情況下打補(bǔ)丁。但是還是有點(diǎn)小技巧的哦!先讓我們看看下面這個(gè)例子。

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

然后我們?cè)僭囋囌{(diào)用新定義的方法:

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>

出錯(cuò)啦!引發(fā)錯(cuò)誤的原因就是被調(diào)用的對(duì)象并沒有作為第一個(gè)參數(shù)傳給我們寫的函數(shù)。當(dāng)然我們可以自己把參數(shù)傳進(jìn)去,但是在這個(gè)替換類方法的場(chǎng)景下并不奏效。解決這個(gè)問題的正確方案是用 type 這個(gè)模塊里的 MethodType 函數(shù),我們可以看看下面的示例代碼:

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)

現(xiàn)在我們的方法已經(jīng)和實(shí)例綁定了,大功告成!

總結(jié)

運(yùn)行中替換或者添加方法是非常有用的,比如說在單元測(cè)試中,有些負(fù)責(zé)和外界服務(wù)通信的函數(shù)就需要替換掉,方便測(cè)試。這個(gè)技巧不僅很常用,而且在你最終決定要修改代碼之前還可以保持代碼的可維護(hù)性,是一個(gè)非常重要的技巧。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

丰镇市| 清水县| 九龙城区| 屏东市| 新安县| 威海市| 泾阳县| 离岛区| 视频| 清水县| 秀山| 河西区| 华宁县| 巴里| 西乌珠穆沁旗| 宝山区| 潞城市| 永宁县| 稻城县| 四会市| 宁晋县| 绥阳县| 邳州市| 阳春市| 平顶山市| 东城区| 夹江县| 东光县| 龙里县| 灵宝市| 宾川县| 万安县| 湘西| 桐庐县| 清远市| 米脂县| 柳州市| 永德县| 正镶白旗| 封丘县| 同德县|