2014-12-01 20 views
3

我有一個小應用程序,並且無法確定如何實現這一部分。原則上,這裏的問題是我需要爲類添加一個方法。但是,該類的實例是通過另一個類中的方法生成的。因此我不清楚如何在不創建第二類的子類的情況下實現子類。如何從另一個類的方法生成原始類的實例時處理子類?

更具體地說,這兩個類是: PlotItem和GraphicsLayoutWidget(來自pyqtgraph的類 - 下面縮寫pg)。

所以,在我的應用程序有:通過調用GraphicsLayoutWidget的addPlot()方法生成的PlotItem類

self.plotWidget = pg.GraphicsLayoutWidget 

實例。即:

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

我沒有看到繼承GraphicsLayoutWidget的不好之處。這樣可以更好地控制發生的事情,並使代碼更易於閱讀。 – 2014-12-01 21:16:42

+0

如果您使用'PlotItem'類,那麼您的'paint'方法將被* all * plot-items使用,而不僅僅是通過'addPlot'添加的方法。爲了避免這種情況,你可以修改'PlotItem' *實例*。但是,實際上,最自然的方法是對'GraphicsLayoutWidget'和'PlotItem'進行子類化。 – ekhumoro 2014-12-01 23:13:29

回答

0

你可以添加你的類一個新的構造,從一個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)) 

並且具有所需方法的實例。

相關問題