【问题标题】:Acessing variables from one class in another class从另一个类中的一个类访问变量
【发布时间】:2020-11-24 19:28:29
【问题描述】:

我仍在做与我之前尝试模拟粒子扩散的问题相同的项目。我之前的问题与此无关,除了仍在尝试模拟扩散。我正处于尝试在网格内启动不同扩散区域的阶段,因此我有一个功能可以生成列表(坐标)列表,可以在每个移动步骤中对照粒子的坐标来检查以调整概率运动,以及扩散性。

我正在使用 2 个类;一个用于启动扩散网格空间,grid(),另一个用于移动粒子,atom()。 atom() 类不从 grid() 类继承变量。使用initial t_space 在grid() 中创建了一个名为t_space 的坐标区域,我想访问在atom() 中initial t_space 中生成的这个变量t_space。

我的代码很长,所以我已经包含了我希望是相关的部分,以及我目前解决这个问题的尝试。

我希望在 atom() 中从 grid() 调用 t_space 变量的代码是:

atom().tspace = grid().t_space

class grid():
    
    def __init__(self, x, y):
        self.grid = np.zeros((x,y))
        self.list_of_atoms=[]
        self.x = x
        self.y = y
        
    def initiate_t_space(self,t_space_x, t_space_y): 

         self.t_space = []
         for i in range(0,self.t_space_x):
             for j in range(0,self.t_space_y):
                 self.t_space.append([i,j])

 class atom():

    def __init__(self,x,y):
        self.position=[x,y]
        self.position_tracker=[]
        self.dx=0
        self.dy=0
        # self.tspace = [[11, 42], [11, 43], [11, 44], [11, 45], [11, 46], [11, 47], [11, 48], [11, 49], [11, 50], [11, 51], [11, 52], [11, 53], [11, 54], [11, 55], [11, 56], [11, 57], [11, 58], [12, 38], [12, 39], [12, 40], [12, 41], [12, 42], [12, 43], [12, 44], [12, 45], [12, 46], [12, 47], [12, 48]]
        # self.t_space = []
        # for i in range(0,100):
        #     for j in range(0,200):
        #         self.t_space.append([i,j])
        # print(self.t_space)
        atom().tspace = grid().t_space

atom() 类中被注释掉的代码是先前尝试在 atom() 中启动 t_space,但是它需要在 grid() 中计算,因为它使用来自 grid() 的变量。

任何帮助将不胜感激。

【问题讨论】:

  • 原子真的需要知道它所在的网格吗?
  • 我认为是这样,因此它可以确定该位置的扩散率
  • 那么你就有了循环依赖……你可以从网格类本身更新存储在网格中的原子信息。

标签: python class class-variables


【解决方案1】:

您的变量不是类属性,而是实例属性grid() 实例化您的网格类,但您没有在任何地方分配该实例的 t_space(看起来您现在唯一这样做的方法是在该创建的对象上调用 initiate_t_space(t_space_x, t_space_y))。

如果t_space 旨在成为一个类属性,并且对于所有网格都相同,那么您应该创建并定义它。如果它打算成为 instance 属性,则需要在任何地方引用任何实例的 t_space 之前为每个实例定义它。

无论如何,您需要调用initiate_t_space(t_space_x, t_space_y) 来设置网格的t_space,您没有这样做。换句话说,您的程序永远不会运行 insitiate_t_space 函数中的代码。

Read more about classes

【讨论】:

  • 感谢您的评论,我没有提到这些类是从不同的代码页面调用的:gr=grid(20,20) gr.initiate_t_space(10,10)
  • 随后调用 atom()
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2011-10-22
相关资源
最近更新 更多