当来自另一个类的方法生成原始类的实例时,如何处理子类?

时间:2014-12-01 20:30:17

标签: python subclass monkeypatching class-method

我有一个很小的应用程序我正在制作并且无法弄清楚如何实现这一部分。原则上,这里的问题是我需要向类添加方法。但是,该类的实例是通过另一个类中的方法生成的。因此,我不清楚如何在不创建第二个类的子类的情况下实现子类。

更具体地说,这两个类是: PlotItem和GraphicsLayoutWidget(来自pyqtgraph的类 - 下面的缩写pg)。

所以,在我的应用程序中,我有:

self.plotWidget = pg.GraphicsLayoutWidget

PlotItem类的实例是通过从GraphicsLayoutWidget调用addPlot()方法生成的。即:

plt = self.plotWidget.addPlot(*args)

问题是我需要在PlotItem类中添加一个方法,我计划通过对它进行子类化来实现。但是,我不知道如何生成它的实例而不继承GraphicsLayoutWidget。

这是最好的解决方案吗?我已经阅读了一些关于猴子修补方法到PlotItem类的内容,但我一般不熟悉这种方法(对所有这些都比较新)。

如果它是相关的,则(简化的)子类定义:

class MyPlotItem(PlotItem):
    def paint(self, painter, *args):
        painter.setPen(...)
        painter.drawRect(self.boundingRect())
        PlotItem.paint(self, painter, *args)

2 个答案:

答案 0 :(得分:0)

您可以为您的类添加一个新构造函数,该构造函数从MyPlotItem创建PlotItem实例,例如:

class MyPlotItem(PlotItem):

    @classmethod
    def from_plotitem(cls, plotitem):
        return cls(plotitem.parent, plotitem.name, ...)

    def paint(self, painter, *args):
        painter.setPen(...)
        painter.drawRect(self.boundingRect())
        PlotItem.paint(self, painter, *args)

然后你可以替换:

plt = self.plotWidget.addPlot(*args)

使用:

plt = MyPlotItem.from_plotitem(self.plotWidget.addPlot(*args))

并拥有一个具有所需方法的实例。

答案 1 :(得分:0)

我最近有一个类似的问题,我希望将$('form').submit(function(e) { e.preventDefault(); // cancel the default action baseUrl = '@Url.Action("FilterByType", "Employees")'; var selectedEmployee = $('#EmployeeTypeID').val(); location.href = baseUrl + '/' + selectedEmployee; // redirect }); 子类化,以便在点击时触发信号。

我没有使用PlotItem的子类,而是使用GraphicsLayoutWidget,而是使用addPlot()的{​​{1}}函数,如下所示:

GraphicsLayoutWidget

这很有效,因为addItem()一旦创建了from PyQt4.QtCore import * from PyQt4.QtGui import * import pyqtgraph as pg import sys class myPlotItem(pg.PlotItem): clicked = pyqtSignal(QObject) def __init__(self, parent = None): super(myPlotItem, self).__init__(parent) def mousePressEvent(self, ev): super(myPlotItem, self).mousePressEvent(ev) self.clicked.emit(self) def on_click(plot): print 'clicked! ' + str(plot) app = QApplication([]) figure = pg.GraphicsLayoutWidget() plot = myPlotItem() plot.clicked.connect(on_click) figure.addItem(plot) figure.show() sys.exit(app.exec_()) ,就会以同样的方式调用addPlot()

undefined behavior