gpt4 book ai didi

python - 在 Python 中,如何继承和覆盖类实例上的方法,将新版本分配给与旧版本相同的名称?

转载 作者:行者123 更新时间:2023-11-28 22:27:20 28 4
gpt4 key购买 nike

在 Matplotlib 中,一个常见的问题是 Patch 之间不需要的白线使用 pcolor 绘制的对象, pcolormesh , 和 contourf (前两者参见 this question,后者参见 this question)。

我试图通过向我的 Axes 添加新方法来自动修复此问题使用 MethodType 的类/子类实例.我这样做而不是子类化只是因为我想生成 Axes通过传递 GridSpec 的切片反对 add_subplot Figure 上的方法例如,我不知道如何使用某种子类 matplotlib.axes.Subplot 来做到这一点(但我欢迎建议)。下面是一些示例代码:

from types import MethodType
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

f = plt.figure()
gs = GridSpec(2,1)
ax = f.add_subplot(gs[0,0])

def _pcolormesh(self, *args, **kwargs):
p = self.pcolormesh(*args, **kwargs)
p.set_edgecolor('face')
p.set_linewidth(0.2) # Will cover white lines, without making dot in corner of each square visible
return p

def _contourf(self, *args, **kwargs):
c = self.contourf(*args, **kwargs)
for _ in c.collections:
_.set_edgecolor('face')
return c

ax.mypcolormesh = MethodType(_pcolormesh, ax)
ax.mycontourf = MethodType(_contourf, ax)

在最后一行,我希望能够写成ax.pcolormesh 代替 ax.mypcolormesh , 但这会引发 RecursionError ,因为 _pcolormesh调用原始方法名称...现在已为其自身设置别名。

那么,我怎样才能访问这个 Axes 上的方法呢?实例,覆盖它,并保留原始名称?

最佳答案

高效的解决方案

由于单独替换每个轴的方法比使用一个简单的函数要输入更多的代码,因此最有效的方法是创建一个 Python 文件 myhacks.py,其中包含相应的函数

def pcolormesh(ax, *args, **kwargs):
p = ax.pcolormesh(*args, **kwargs)
p.set_edgecolor('face')
p.set_linewidth(0.2)
return p

并在需要改进版本的 pcolormesh 时使用它:

import matplotlib.pyplot as plt
import myhacks as m
# ...other imports

fig, ax = plt.subplots()
m.pcolormesh(ax, other_arguments)

这对于已经创建的文件也很有效,人们只需搜索替换 "ax.pcolormesh(""m.pcolormesh(ax,"(如果有必要对可能的其他轴名称使用正则表达式)。

学术解决方案

当然可以子类化 matplotlib.axes.Axes 以包含所需的功能。由于除了知道如何去做之外没有任何实际好处,我将其称为“学术解决方案”。

因此,我们可以再次为我们的自定义类创建一个文件 myhacks.py,将自定义类注册为 Matplotlib 的投影,

from matplotlib.axes import Axes
from matplotlib.projections import register_projection

class MyAxes(Axes):
name = 'mycoolnewaxes'
def pcolormesh(self,*args, **kwargs):
p = Axes.pcolormesh(self,*args, **kwargs)
p.set_edgecolor('face')
p.set_linewidth(0.2)
return p

register_projection(MyAxes)

并通过导入它并使用投影创建轴来使用它:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import myhacks as m

fig = plt.figure()
gs = GridSpec(2,1)
ax = fig.add_subplot(gs[0,0], projection='mycoolnewaxes')

z = np.random.rand(10,13)
ax.pcolormesh(z)

plt.show()

关于python - 在 Python 中,如何继承和覆盖类实例上的方法,将新版本分配给与旧版本相同的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44090563/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com