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

Python 允许类中的子类访问基类属性,python,class,oop,Python,Class,Oop,我正试图了解Python中的类,想知道是否有人能帮我解决以下问题 我有一个基类,我打算包含有关数值模拟的所有信息,以及一旦运行模拟的结果。不过,我也有一些例程,可以将模拟数据输出到一个文件中,以便以后进行操作 因此,我想编写代码,在一个单独的类中将模拟数据处理并绘制到主模拟类中(为了整洁起见,在一个单独的.py文件中)。然后,此plotting类可以有两个初始化选项:用于处理主仿真类当前现有实例中的数据,或从准备处理的文件加载仿真数据 对于前一种情况,plotting类应初始化为simulati

我正试图了解Python中的类,想知道是否有人能帮我解决以下问题

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

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

对于前一种情况,plotting类应初始化为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]
对于打印代码在现有sim对象上运行的情况,其用途为:

sim = SimClass(param1 = 5)
sim.run()
sim.plot1()
欢迎您提出任何建议(甚至只是指出我在上面关于类和OOP的术语可能被误用)


谢谢

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

class SimPlot(SimClass):
    ...

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

听起来您只需要访问Simlot中的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()

(根据您的评论进行更新)

好的,虽然这不会自动初始化SimClass,但我需要的是执行sim.run()后写入已初始化SimClass的参数?@IanRoberts:然后进行
\uu init\uuuuuuuz()
SimPlot
子类的构造函数有一个参数,它是一个已经初始化的
SimClass
对象——或者将所有参数传递给它,创建一个并在方法中初始化。谢谢,尽管这和我的意图相反。我想做sim=SimClass()。然后sim.plot=SimPlot(),然后通过执行sim.plot.plot1()调用我的各种处理脚本。i、 e.plot1是simlot()的函数,而不是SimClass(),我更新了答案。。风格注释:通常这个类只被称为Sim或Simulation,而不是SimClass(因为它已经知道它是一个类)。