在Python中从一个类访问变量到另一个类
我有几个巨大的表与数据调用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表,一劳永逸地加载。
一般情况 - 对于目前的代码,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)
方法,避免实例化一个新类。
首先,当您使用继承时,您不需要将父类的实例传递给子类。这就是你正在使用继承。
在pyhton 3中调用父构造函数使用super()
,并在python 2中使用new_style类或在old_style类中直接调用父构造函数后,可以简单地访问子类中的父类属性。然后,您将确保在每个实例化bnds.data
和densities.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()
是的,它是正确的。只要你像上面所做的那样只实例化一个Pixel对象,就可以制作多个引用像素数据的Density对象。 – Alexander
@亚历山大只是为了澄清,你的意思是,如果我写这样的东西: '我在范围内(90):rho =密度(像素,我,我)'Pixel类将只被引用一次? – Albert
它将被多次引用,但只创建一次。并且不要从Density继承Pixel。只是'班密度(对象):' – Alexander