如何在不编辑原始模块的情况下从第三方Python模块向类添加方法

时间:2014-02-26 13:12:14

标签: python class methods

我在matplotlib工具包(Basemap)中使用basemap模块中的mpl_toolkits.basemap.Basemap对象。在basemap的{​​{1}}文件(即__init__.py模块)中,定义了一种方法mpl_toolkits.basemap.__init__,用于在地图上绘制纬度。我的目标是复制该方法以制作一个名为drawparallels的新方法,进行一些调整以绘制磁纬度而不是地理纬度。

理想情况下,我希望新的drawmlat等同于原始的drawmlat(我可以使用drawparallel调用的Basemap实例的绑定方法),我做的不想修改原始文件。我该如何做到这一点?

我尝试了"配方的变体" BasemapInstance.drawmlats(),但没有在原始源文件中放置任何内容,新方法无法从Basemap模块访问全局变量等(例如,在其MyObj.method = MethodType(new_method, None, MyObj)中定义)。

如果看起来我误解了某些东西,我可能已经 - 我或多或少都是面向对象编程的新手。

1 个答案:

答案 0 :(得分:4)

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个全局变量。