2016-02-27 214 views
0

我有几个巨大的表与数据调用bnds.data密度。数据。我还有一个处理这些数据表的类。 该类被称为循环,为了避免重复和时间要求将这些数据表加载到内存中,我想创建另一个类并初始化其中的一些变量。 下面是一段代码,给什么我想要做的想法:在Python中从一个类访问变量到另一个类

import numpy as np 

class Pixel: 
    def __init__(self): 
     self.bounds = np.loadtxt('bnds.data') 
     self.rho = np.loadtxt('densities.data') 

class Density(Pixel): 

    def __init__(self, pixel, phi, theta): 
     self.phi = phi 
     self.theta = theta 
     latitude = int(90 - self.phi +1) 
     longitude = int(180 + self.theta + 1) 
     n = (latitude -1)*360 + longitude -1 
     self.rho = pixel.bounds[n] 

    def print_rho(self): 
     print (self.rho) 

pixel = Pixel() 
rho = Density(pixel, 10, 20) # phi = 10, theta = 20 
rho.print_rho() 

这里,像素的情况下被发送到班密度。数据加载在Pixel类中完成。密度类将在循环中调用。我不太明白的是每次调用Density类时是否会初始化Pixel类?如果是,那么如何避免它?我的猜测是,无论Density类被调用多少次,Pixel类都会一劳永逸地初始化。这是对的吗? phi and theta是变量,它们在循环中取不同的值。我需要的是bnds.data & densities.data表,一劳永逸地加载。

+0

是的,它是正确的。只要你像上面所做的那样只实例化一个Pixel对象,就可以制作多个引用像素数据的Density对象。 – Alexander

+0

@亚历山大只是为了澄清,你的意思是,如果我写这样的东西: '我在范围内(90):rho =密度(像素,我,我)'Pixel类将只被引用一次? – Albert

+1

它将被多次引用,但只创建一次。并且不要从Density继承Pixel。只是'班密度(对象):' – Alexander

回答

1

一般情况 - 对于目前的代码,Pixel的__init__只执行一次。但是,Density不需要是Pixel的子类,它不具有相似性或功能。

一个更明智的解决办法是对像素的方法,该方法返回一个密度,这是需要密度的初始化,如:

class Pixel: 
    def __init__(self): 
     self.bounds = np.loadtxt('bnds.data') 
     self.rho = np.loadtxt('densities.data') 

    def get_density(self, phi, theta): 
     return Density(self, phi, theta) 

pixel = Pixel() 
rho = pixel.get_density(10,20) # phi = 10, theta = 20 
rho.print_rho() 

你让你的代码更易读的方式。

请注意,如果性能至关重要,类可能非常昂贵。如果你只计算rho,你也可以将整个Density类转换为get_rho(phi, theta)方法,避免实例化一个新类。

+0

谢谢!我认为你的答案是最好的!我还有很长的路要走...... – Albert

+0

继续做好工作,有一天在一个时间做了一年的巨大努力! – hruske

+0

是的,我会尝试!顺便说一下,你知道在'__init__'中是否通常被认为是一个很好的练习吗?例如,如果我写这样的东西,可以吗:self.v_x = dx/dt,其中“dx”和“dt”是输入变量? – Albert

0

首先,当您使用继承时,您不需要将父类的实例传递给子类。这就是你正在使用继承。

在pyhton 3中调用父构造函数使用super(),并在python 2中使用new_style类或在old_style类中直接调用父构造函数后,可以简单地访问子类中的父类属性。然后,您将确保在每个实例化bnds.datadensities.data表后将加载一次。

class Pixel: 
    def __init__(self): 
     self.bounds = np.loadtxt('bnds.data') 
     self.rho = np.loadtxt('densities.data') 

class Density(Pixel): 
    def __init__(self,phi,theta): 
     super(Density, self).__init__() 
     self.phi = phi 
     self.theta = theta 
     latitude = int(90 - self.phi +1) 
     longitude = int(180 + self.theta + 1) 
     n = (latitude -1)*360 + longitude -1 
     self.new_rho = self.bounds[n] 
    def print_rho(self): 
     print (self.new_rho) 

rho = Density(10,20) # phi = 10, theta = 20 
rho.print_rho() 
+0

不,你的例子是错误的。每次调用Density \ _ \ _ init__时,都会确保执行Pixel。 – hruske

+0

@hruske确实。正如我在每个实例化之后说的*,它们将被创建。一旦创建对象,就不需要多次调用对象的构造函数。 – Kasramvd

+0

Albert询问了如何为多个Density对象只加载一次数据。您的示例将在每次实例化一个Density对象时加载数据,这是Albert打算在循环中执行的。这与他的意图相反。 – hruske

相关问题