Python 如何覆盖“savefig”方法,以便它可以解压元组

Python 如何覆盖“savefig”方法,以便它可以解压元组,python,savefig,Python,Savefig,我正在研究一段代码的最小扩展 我有一个make_fig函数,该函数过去只生成一个图形,我在许多其他函数中将其称为fig,然后将其另存为fig.savefig 在扩展中,make_fig现在返回一个图形元组。所以,为了拯救他们,我现在需要一些类似的东西: fig = make_fig for f in fig: f.savefig 我希望有一个更优雅的解决方案,它不需要在出现make_fig的任何地方添加for循环 我是否可以修改a.savefig方法,以便在a是matplotlib.p

我正在研究一段代码的最小扩展

我有一个
make_fig
函数,该函数过去只生成一个图形,我在许多其他函数中将其称为
fig
,然后将其另存为
fig.savefig

在扩展中,
make_fig
现在返回一个图形元组。所以,为了拯救他们,我现在需要一些类似的东西:

fig = make_fig

for f in fig:
   f.savefig
我希望有一个更优雅的解决方案,它不需要在出现
make_fig
的任何地方添加for循环

我是否可以修改
a.savefig
方法,以便在
a
matplotlib.pytplot
实例时执行其正常功能,如果是元组,则执行上面的for循环

我在下面

d=1
是“旧”代码,
d=2
是我要添加的扩展名

import matplotlib.pyplot as plt 

def make_fig(d):
    if d==1:
        fig, ax = plt.subplots(1)
    elif d==2:
        fig1, ax = plt.subplots(1)
        fig2, ax = plt.subplots(1)
        fig = (fig1, fig2)
    else:
        raise Exception('error')
    return fig

d=2
fig = make_fig(d)
fig.savefig('hello.png')

只需实现您自己的
savefig
函数即可处理这两种情况

from collections.abc import Iterable

def savefig(filename, fig):
    if not isinstance(fig, Iterable):
        fig = (fig,)
    for i, f in enumerate(fig):
        f.savefig(f'{filename}_{i}.jpg')


fig = make_fig(1)
savefig('test1', fig)
fig = make_fig(2)
savefig('test2', fig)
执行后,我们有
test1_0.jpg
test2_0.jpg
test2_1.jpg

作为
if
检查的替代方法,您可以使用以下方法:

def savefig(filename, fig):
    try:
        fig.savefig(filename)
    except AttributeError:
        for i, f in enumerate(fig):
            f.savefig(f'{filename}_{i}.jpg')

只需实现您自己的
savefig
函数即可处理这两种情况

from collections.abc import Iterable

def savefig(filename, fig):
    if not isinstance(fig, Iterable):
        fig = (fig,)
    for i, f in enumerate(fig):
        f.savefig(f'{filename}_{i}.jpg')


fig = make_fig(1)
savefig('test1', fig)
fig = make_fig(2)
savefig('test2', fig)
执行后,我们有
test1_0.jpg
test2_0.jpg
test2_1.jpg

作为
if
检查的替代方法,您可以使用以下方法:

def savefig(filename, fig):
    try:
        fig.savefig(filename)
    except AttributeError:
        for i, f in enumerate(fig):
            f.savefig(f'{filename}_{i}.jpg')

为此,您可以返回自己的对象,而不是返回元组,该对象将元组作为字段之一

class MultipleFigures:

    def __init__(self, figures):
        self.figures = figures

    def savefig(self):
        for fig in self.figures:
            fig.savefig()

然后,
make fig
函数可以返回一个
matplotlib.pytplot
实例或一个
MultipleFigures
实例。

为此,您可以返回自己的对象,而不是返回一个元组,其中元组是字段之一

class MultipleFigures:

    def __init__(self, figures):
        self.figures = figures

    def savefig(self):
        for fig in self.figures:
            fig.savefig()

然后,
make fig
函数可以返回一个
matplotlib.pytplot
实例或一个
MultipleFigures
实例。

谢谢。在您的
custom\u savefig
中,我如何引用
fig
?@SuperCiocia和
self
,我更新了我的答案,但这仅在
fig
是一个图形时有效,因此它有
savefig
作为一种方法。如果我的
fig=(图1,图2)
,其中
fig1
fig2
是数字呢?@SuperCiocia查看更新的答案,一个更简单更安全的解决方案谢谢,Iterable来自哪里?谢谢。在您的
custom\u savefig
中,我如何引用
fig
?@SuperCiocia和
self
,我更新了我的答案,但这仅在
fig
是一个图形时有效,因此它有
savefig
作为一种方法。如果我的
fig=(图1,图2)
,其中
fig1
fig2
是数字呢?@SuperCiocia查看更新的答案,一个更简单更安全的解决方案谢谢,
Iterable
来自哪里?