2016-02-27 266 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