2014-02-26 54 views
2

我在matplotlib工具箱(mpl_toolkits.basemap.Basemap)中使用basemap模塊中的Basemap對象。在basemap__init__.py文件(即,mpl_toolkits.basemap.__init__模塊)中,定義了在地圖上繪製緯度的方法drawparallels。我的目標是複製該方法,以製作一種名爲drawmlat的新方法,對其進行一些調整以繪製磁緯度而不是地理緯度。如何在不編輯原始模塊的情況下向第三方Python模塊的類添加方法

理想情況下,我希望新drawmlat等同於原來的drawparallel(綁定底圖,我可以使用BasemapInstance.drawmlats()調用實例的方法),我不希望修改原始文件。我怎麼做到這一點?

我已經嘗試了「處方」 MyObj.method = MethodType(new_method, None, MyObj)的變化,但沒有原始源文件中放置任何,新方法不具有訪問來自底圖模塊全局等(在其__init__.py例如定義)。

如果看起來我誤解了某些東西,我可能已經 - 我對於面向對象編程或多或少都是全新的。

+1

[將方法添加到現有對象]可能的重複 –

回答

3

Python是高度可修改的。只要你的函數添加到

from mpl_toolkits.basemap import Basemap 


def drawmlat(self, arg1, arg2, kw=something): 
    pass 

Basemap.drawmlat = drawmlat 

現在Basemap類有一個drawmlat方法;在實例上調用它並且self將被綁定到實例對象。在實例上查找方法時,該函數將自動作爲您的方法綁定。

Basemap.__init__方法中定義的任何需要關心的方法都是self上的屬性。

已經觀察過mpl_toolkits.basemap.__init__模塊,我也看到drawparallel方法依賴於幾個全局;你可以將這些從模塊導入到你自己的命名空間中:

from mpl_toolkits.basemap import Basemap, _cylproj, _pseudocyl 

這與你所做的其他進口沒有什麼不同;原始的drawparallel方法也依賴於import numpy as npfrom matplotlib.lines import Line2D,這使得原始模塊中的全局變量爲npLine2D

+0

有趣的是,我從中學到了一些東西, thx – WeizhongTu

+0

不起作用。 'mpl_toolkits.basemap'模塊(文件夾)(注意小寫字母b)包含文件'__init __。py',其中定義了'Basemap'類(大寫字母B)。 「Basemap」類的方法使用在此__init __。py'文件中定義的全局變量,但在「Basemap」類之外定義。當我遵循你的建議,而是用你已有的'drawparallels'方法替換你的虛擬'drawmlat'函數時,我得到'NameError:全局名'_cylproj'沒有被定義'其中'_cylproj'是我提到的全局變量是'drawparallels'方法中使用的。 – cmeeren

+0

@cmeeren:您可以將其他全局變量從該模塊導入到您自己的模塊中。我會看看確切的源代碼。 –

相關問題