2013-03-20 82 views
1

我有一個類,如下所示:使用類方法/屬性的實例變量的外

class Spheroid(object):                                       
    def __init__(self,shortt,longg):                                   
    self.shortax = shortt                                     
    self.longax = longg                                     
    self.alpha=self.longax/self.shortax                                  

    @property                                                                                   
    def volume(self):                                       
    return (4*np.pi/3) * self.shortax * self.shortax * self.longax 

在一段代碼以後,我使用卷功能如下:

x=np.arange(5,8.5,dx) 
y=np.arange(5,30,dy) 
X,Y = np.meshgrid(x,y) 

Z = vol(X,Y) 

vol函數與我在我的類中定義的@property完全相同。要獲得此代碼工作,我不得不復制並粘貼類@property,並把它變成一個普通函數是這樣的:

def vol(a,b): 
    return (4*np.pi/3) * a * a * b 

我總是告訴複製和粘貼代碼是一個標誌,我做錯了什麼。所以我的問題是,是否有一種方法可以重新設計我的類,以便可以在不創建實例的情況下調用我在該Spheroid類中定義的volume @property/method,以便Z = vol(X,Y)可以工作?

感謝

+2

否 - 該功能將參數和方法作用於類屬性。所以你最好保留'vol'函數,並將'volume'屬性重新定義爲'return vol(self.shortax,self.longax)'。然後,音量表達式在'vol'函數中只定義一次(更容易維護)。 – isedev 2013-03-20 22:21:06

+0

@isedev我有同樣的想法,但你繼續並提交它;) – jamylak 2013-03-20 22:21:53

回答

0

我會按照scott_fakename建議和使用一個靜態方法是這樣的:

class Spheroid(object): 

    def __init__(self, shortt, longg): 
     self.shortax = shortt 
     self.longax = longg 
     self.alpha = self.longax/self.shortax 

    @property 
    def vol(self): 
     return Spheroid.volume(self.shortax, self.longax) 

    @staticmethod 
    def volume(shortax, longax): 
     return (4 * np.pi/3) * shortax * shortax * longax 

# outside the instance call it like this 
Spheroid.volume(X, Y) 
+0

是的,我更喜歡...刪除我的答案。 – isedev 2013-03-20 22:33:46

0

如果你的目標是使卷(X,Y)的工作,你可以定義捲來創建傳遞給它的參數的新對象,調用該屬性,然後返回。

或者你可以在你的球體類中創建一個名爲Vol的函數,並使該函數成爲靜態的。然後你可以讓該函數的實例版本調用靜態版本。