2013-12-13 46 views
1

我只是想知道什麼時候將東西存儲爲類實例的一部分,而不是何時使用方法返回東西。例如,下列哪項會更好:何時將事物作爲實例的一部分存儲並返回?

class MClass(): 

    def __init__(self): 
     self.x = self.get_x() 
     self.get_y() 
     self.z = None 
     self.get_z() 

    def get_x(self): 
     return 2 

    def get_y(self): 
     self.y = 5 * self.x 

    def get_z(self): 
     return self.get_x() * self.x 

什麼是關於這樣的事情,並約定時,我應該指定的東西自我時,我應該返回值?這實質上是公共/私人的區別?

+1

請解決您的代碼的好方法(壓痕,缺少'ßelf'爲方法的參數等)。 –

回答

2

可以使用@property裝飾:

class MClass(): 

    def __init__(self): 
     self.x = 2 

    @property 
    def y(self): 
     return 5 * self.x 

    #here a plus method for the setter 
    @y.setter 
    def y(self,value): 
     self.x = y/5 

    @property  
    def z(self): 
     return self.x * self.x 

這是組織你的acessors

3
  1. 您不應該return任何東西從__init__
  2. Python不是Java。你不需要包括get的一切。
  3. 如果x總是2並且y總是10並且z總是12,那就是很多代碼。

使一些假設,我會寫這個類:

class MClass(object): 

    def __init__(self, x): 
     self.x = x 

    def y(self): 
     return self.x * 5 

    def z(self): 
     return self.x + self.y() 

>>> c = MClass(2) 
>>> c.x 
2 
>>> c.y() # note parentheses 
10 
>>> c.z() 
12 

這使得x改變後(例如c.x = 4),並且仍然給出正確的值yz

+5

如果'y'和'z'應該和'x'類似,你應該用'@ property'裝飾器來使它們成爲屬性。 – Blckknght

2

對此,AFAIK沒有任何「約定」,雖然有一些常見的做法,每種語言都有所不同。

在python中,人們普遍認爲「一切都是公開的」,並沒有任何理由讓getter方法返回的實例變量值。但是,如果需要在訪問此類變量時對實例執行操作,則可能需要這種方法。

get_y方法,例如,只有當你需要在每次訪問時間值重新計算表達式(5 * self.x)是有道理的。否則,您應該簡單地在__init__的實例中定義y變量 - 速度更快(因爲您不會每次都重新計算值),並且它使您的意圖變得清晰(因爲任何查看代碼的人都會立即知道該值不會改變)

最後,有些人更喜歡使用屬性,而不是編寫純粹的get/set方法。有更多的信息在this question

1

get應該總是做它說的。 get_y()get_z()不這樣做。

做的更好:

class MClass(object): 
    def __init__(self): 
     self.x = 2 

    @property 
    def y(self): 
     return 5 * self.x 

    @property 
    def z(self): 
     return self.x * self.x 

這使得yz總是取決於x值。

你可以做

c = MClass() 
print c.y, c.z # 10, 4 
c.x = 20 
print c.y, c.z # 100, 400 
2

我看了你的問題,作爲一般的面向對象的開發問題,而不是一個具體的蟒蛇一個。因此,成員數據的一般規則是僅當數據作爲特定實例的一部分相關時纔將數據保存爲類的成員。

作爲一個例子,如果你有一個屏幕對象,它有兩個維度,高度和寬度。這兩個應該作爲成員存儲。與特定實例關聯的區域將返回與特定實例的高度和寬度關聯的值。

如果某些事情看起來像是應該在飛行中計算的,但可能會一遍又一遍地被調用,您也可以將它們緩存爲成員,但這確實是在您確定它之後應該執行的操作是一種有效的權衡(額外成員換取更快的運行時間)。

相關問題