欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python類的動態(tài)修改的實例方法

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

Python類的動態(tài)修改的實例方法

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

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

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

給類打補丁

如果我們想新增或是修改對象的方法的話,最簡單的方式莫過于給類打個補丁了。結(jié)合上面的例子,如果我們想給我們自己的 Dog 類寫一個新的 howl 方法的話,我們可以定義一個新的 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

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

給類實例打補丁

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

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

然后我們再試試調(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>

出錯啦!引發(fā)錯誤的原因就是被調(diào)用的對象并沒有作為第一個參數(shù)傳給我們寫的函數(shù)。當(dāng)然我們可以自己把參數(shù)傳進(jìn)去,但是在這個替換類方法的場景下并不奏效。解決這個問題的正確方案是用 type 這個模塊里的 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)和實例綁定了,大功告成!

總結(jié)

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

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

相關(guān)文章

  • 在IPython中執(zhí)行Python程序文件的示例

    在IPython中執(zhí)行Python程序文件的示例

    今天小編就為大家分享一篇在IPython中執(zhí)行Python程序文件的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python中urllib.unquote亂碼的原因與解決方法

    python中urllib.unquote亂碼的原因與解決方法

    這篇文章主要給大家介紹了python中urllib.unquote亂碼的原因與解決方法,文中介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友可以參考學(xué)習(xí),下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • Python中round()函數(shù)實現(xiàn)數(shù)值的四舍五入

    Python中round()函數(shù)實現(xiàn)數(shù)值的四舍五入

    這篇文章主要給大家介紹了關(guān)于Python中round()函數(shù)實現(xiàn)數(shù)值的四舍五入,round()是python自帶的一個函數(shù),用于數(shù)字的四舍五入,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Django框架模板語言實例小結(jié)【變量,標(biāo)簽,過濾器,繼承,html轉(zhuǎn)義】

    Django框架模板語言實例小結(jié)【變量,標(biāo)簽,過濾器,繼承,html轉(zhuǎn)義】

    這篇文章主要介紹了Django框架模板語言,結(jié)合實例形式總結(jié)分析了Django框架中變量,標(biāo)簽,過濾器,繼承,html轉(zhuǎn)義等相關(guān)模板語言操作技巧,需要的朋友可以參考下
    2019-05-05
  • Python3中的re.findall()方法及re.compile()

    Python3中的re.findall()方法及re.compile()

    這篇文章主要介紹了Python3中的re.findall()方法及re.compile(),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python中DataFrame數(shù)據(jù)合并merge()和concat()方法詳解

    python中DataFrame數(shù)據(jù)合并merge()和concat()方法詳解

    Pandas提供了很多合并Series和Dataframe的強大的功能,通過這些功能可以方便的進(jìn)行數(shù)據(jù)分析,下面這篇文章主要給大家介紹了關(guān)于python中DataFrame數(shù)據(jù)合并merge()和concat()方法的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Django環(huán)境下使用Ajax的操作代碼

    Django環(huán)境下使用Ajax的操作代碼

    AJAX 的主要目標(biāo)是在不刷新整個頁面的情況下,通過后臺與服務(wù)器進(jìn)行數(shù)據(jù)交換和更新頁面內(nèi)容,通過 AJAX,您可以向服務(wù)器發(fā)送請求并接收響應(yīng),然后使用 JavaScript 動態(tài)地更新頁面的部分內(nèi)容,這篇文章主要介紹了Django環(huán)境下使用Ajax,需要的朋友可以參考下
    2024-03-03
  • Python使用pyyaml模塊處理yaml數(shù)據(jù)

    Python使用pyyaml模塊處理yaml數(shù)據(jù)

    這篇文章主要介紹了Python使用pyyaml模塊處理yaml數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 深入解析Python中的descriptor描述器的作用及用法

    深入解析Python中的descriptor描述器的作用及用法

    在Python中描述器也被稱為描述符,描述器能夠?qū)崿F(xiàn)對對象屬性的訪問控制,下面我們就來深入解析Python中的descriptor描述器的作用及用法
    2016-06-06
  • python實現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法

    python實現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法

    這篇文章主要介紹了python實現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法,涉及Python實現(xiàn)格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04

最新評論