允许类中的子类访问基类属性

时间:2014-08-25 22:11:13

标签: python class oop

我试图了解Python中的课程并想知道是否有人可以帮助我解决以下问题?

我有一个基类,我打算包含有关数值模拟的所有信息以及运行后的模拟结果。但是,我也有一些例程可以将模拟数据输出到文件中以便日后操作。

因此,我想编写我的代码,在单独的类中处理和绘制模拟数据到主模拟类(并在单独的.py文件中进行整洁)。然后,该绘图类可以有两个初始化选项:用于处理当前现有的主仿真类实例中的数据,或者从准备处理的文件加载仿真数据。

对于前一种情况,绘图类应初始化为,例如:simulation.plot = Plotter(),然后可以访问主仿真类的所有属性。但是,我无法弄清楚如何允许这个子类访问所有基类的属性。

显示我的方案和问题的基本示例是:

class SimClass(object):
    def __init__(self, param1):
        self.param1 = param1
        # and many other parameters

    def run(self):
        # code to run the simulation
        self.results = results

        # initialise plotter as subclass
        self.plot = SimPlot()

class SimPlot(object):
    def init_from_saved_data(self, file_path):
        self.results = code_to_load_data_from_file

    def init_from_existing_sim(self):
        pass  #not sure how to do this        

    def plot1(self):
        plot(self.results[:,0], self.param1 * self.results[:,1]

对于Plotting代码在现有sim对象上运行的情况,用法为:

sim = SimClass(param1 = 5)
sim.run()
sim.plot1()

欢迎任何建议(或者甚至只是指出我上面可能误用过的关于课程和OOP的条款)。

谢谢!

2 个答案:

答案 0 :(得分:1)

你还没有基类和子类,你有两个完全独立的类,它们之间没有任何关系。为了使SimPlot成为SimClass的子类,您需要将其声明为:

class SimPlot(SimClass):
    ...

现在任何SimPlot 自动的实例都可以访问其所有父类的属性。

答案 1 :(得分:1)

听起来你只需要访问SimPlot中的SimClass实例。

你想要这样的东西:

class SimClass(object):
    def run(self):
        self.results = ...
        self.plot = SimPlot(self)

class SimPlot(object):
    def __init__(self, simclass):
        self.simclass = simclass

    def plot1(self):
        # access simclass' attribute(s)
        self.simclass.results

sim = SimClass()
sim.run()
sim.plot.plot1()

(根据您的评论更新)