用模块扩展python类

时间:2015-03-12 13:46:49

标签: python class oop matplotlib


我想用matplotlib中的pyplot模块扩展我的python类:

import matplotlib.pyplot as plt

class MyClass(object, plt):
    pass

这不起作用:

  

TypeError:调用元类库时出错   元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

我发现了this问题,但实际上,它并没有真正帮助我。我用

搜索
>>> type(matplotlib)
>>> type(matplotlib.pyplot)

等。对于课程,但我只获得模块。 API文档也没有说明任何关于类的内容。那么,我做错了什么?我对python来说还是一个新手......

提前谢谢!
-ju -

1 个答案:

答案 0 :(得分:0)

你得到的错误的本质仅仅是因为你不能让一个类继承“object”和matplotlib.pyplot - 但是它们,pyplot是一个模块 - 那个是:“ModuleType”类的一个实例 - 试图用继承来扩充它是没有意义的。

您可以使用简单的属性分配来增加pyplot:

import matplotlib.pyplot

def my_new_plot_function(...):
    ...

matplotlib.pyplot.new_func = my_new_plot_function

并且您的新功能可用于使用pyplot模块的其他模块。但是,正如评论中所述,没有必要这样做 - 从架构的角度来看,这绝对不可取。您甚至可以替换pyplot模块中的一个现有函数或类 - 这称为猴子修补 - 你会发现它非常不可靠,除非你真的,真的知道你在做什么 - 甚至如此,难以维护,以及整个系统中的一个模糊功能。

现在 - Pyplot模块中有类 - 您可以继承这些类,并增强它们的行为 - 您可以从您自己的模块中导入代码中的继承类。也许继承不是在现代代码中添加其行为的最佳方法(首选聚合和代理所需的方法) - 但这样可行。

可以分类的类是:

>>> [obj for obj in dir(pyplot) if isinstance(getattr(pyplot, obj), type)]
['Annotation', 'Arrow', 'Artist', 'AutoLocator', 'Axes', 'Button', 'Circle', 'Figure', 'FigureCanvasBase', 'FixedFormatter', 'FixedLocator', 'FormatStrFormatter', 'Formatter', 'FuncFormatter', 'GridSpec', 'IndexLocator', 'Line2D', 'LinearLocator', 'Locator', 'LogFormatter', 'LogFormatterExponent', 'LogFormatterMathtext', 'LogLocator', 'MaxNLocator', 'MultipleLocator', 'Normalize', 'NullFormatter', 'NullLocator', 'PolarAxes', 'Polygon', 'Rectangle', 'ScalarFormatter', 'Slider', 'Subplot', 'SubplotTool', 'Text', 'TickHelper', 'Widget', 'silent_list']