【问题标题】:Extending python class with module用模块扩展python类
【发布时间】:2015-05-14 17:06:41
【问题描述】:


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

import matplotlib.pyplot as plt

class MyClass(object, plt):
    pass

这不起作用:

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

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

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

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

提前感谢您!
-ju-

【问题讨论】:

  • “我想用 matplotlib 中的 pyplot 模块扩展我的 python 类” - 为什么?您想在这里实现什么目标?
  • 我想用一些我经常在 pyplot 中使用的功能来扩展 pyplot 模块。
  • 那么,你为什么要继承它呢?为什么不创建自己的模块来导入 pyplot 并定义您想要的附加功能?
  • 说实话,我从来没有想过这个……或者类和模块之间的区别。正如我所说,我是 python 新手,对其他语言的 oop 了解(希望不是太少)。
  • 在尝试如此复杂的事情之前,也许您应该更好地掌握 Python 的语法和对象模型?

标签: python class oop matplotlib


【解决方案1】:

你得到的错误的性质仅仅是因为你不能让一个类继承自“object”和matplotlib.pyplot - 但是它们,pyplot 是一个 module - 那是: “ModuleType”类的一个实例——尝试通过继承来增加它是没有意义的。

您可以通过简单的属性分配来扩充 pyplot:

import matplotlib.pyplot

def my_new_plot_function(...):
    ...

matplotlib.pyplot.new_func = my_new_plot_function

并且您的新功能将可用于使用 pyplot 模块的其他模块。然而,正如 cmets 中所述,没有必要这样做——从架构的角度来看,这绝对是不可取的。您甚至可以替换 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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2013-11-09
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多