在Python中从一个类访问变量到另一个类

时间:2016-02-27 22:58:29

标签: python numpy

我有几张名为 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表一次性加载。

2 个答案:

答案 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.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()