我在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)
中定义)。
如果看起来我误解了某些东西,我可能已经 - 我或多或少都是面向对象编程的新手。
答案 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 np
和from matplotlib.lines import Line2D
,它们会在原始模块中生成np
和Line2D
个全局变量。