我有几张名为 bnds.data 和 densities.data 的数据表。我还有一个处理这些数据表的类。 该类在循环中被调用,为了避免重复和时间要求将这些数据表加载到内存中,我想创建另一个类并在那里初始化一些变量。 这是一段代码,提供了我想要做的事情:
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类?如果是,那么如何避免呢?我的猜测是,Pixel类一次性初始化,无论调用Density类的时间长短。这是对的吗? phi 和 theta 是变量,它们在循环中采用不同的值。我需要的是bnds.data& densities.data表一次性加载。
答案 0 :(得分:1)
一般情况下 - 是的,使用当前代码,Pixel的__init__只执行一次。但是,Density不需要是Pixel的子类,它没有相似性或功能。
更明智的解决方案是在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)
方法,从而避免实例化新类。
答案 1 :(得分:0)
首先,当您使用继承时,您不需要将父类的实例传递给子类。这就是你使用继承的东西。
在使用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()