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



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

更具体地说,这两个类是: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)

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

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))

并具有具有所需方法的实例。

我最近遇到了类似的问题,我想对PlotItem进行子类化,以便在单击信号时触发信号。

我不必子类化GraphicsLayoutWidget然后使用addPlot()而是利用GraphicsLayoutWidgetaddItem()函数,如下所示:

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_())

这很好用,因为一旦创建了PlotItem addPlot()它本身就会以相同的方式调用addItem()

http://www.pyqtgraph.org/documentation/_modules/pyqtgraph/graphicsItems/GraphicsLayout.html#GraphicsLayout.addPlot

最新更新