2016-12-06 28 views
0

在類中的方法中引用具有新變量名稱的屬性是不好的做法嗎?例如:在方法中引用屬性

class Stuff: 
    def __init__(self, a): 
     self.a = a 

    def some_method(self): 
     a = self.a 
     # Do some stuff with a 

我在其他人的代碼中看到過這個,我自己養成了一個習慣,尤其是對於長變量名。這似乎是a的副本創建時,我這樣做可能是一個問題,如果a是非常大的。我應該堅持在some_method內撥打self.a嗎? python垃圾在被調用後收集在some_method中創建的a

+0

旁註:你引用的是_attribute_,而不是_property_。 [Python的屬性](https://docs.python.org/3/library/functions.html#property)是類似於屬性的方法。事實上,如果它真的是一個屬性,緩存到本地名稱可能會更有意義(假設屬性是冪等的,所以重複訪問對代碼邏輯來說並不重要),因爲它會避免一遍又一遍地調用該方法。按照慣例,按照慣例,屬性的調用相當便宜,但它的價格仍然高得多(相對而言,儘管不是絕對的規模),但這種簡單的屬性訪問仍然很貴。 – ShadowRanger

+0

修正,謝謝澄清 –

回答

5

這不一定是不好的做法,你可以做這個任務有兩個原因(見@ShadowRanger評論了相當模糊的第三個原因),支持它:

  • 使代碼更易讀(如你提到,長名稱也可以是也是
  • 消除點;如果你有一個單調乏味的循環,使用self.a,如果你不需要每次都執行查找, 太多時間,但是)。此外,如果這不是一個普通的屬性,但內部ad是一個函數,將它分配給一個局部變量將消除從functionmethod的轉換,這也消除了一些執行時間。

此外,複製不是最好的術語,你只是使用不同的名稱引用同一個對象。方法some_method完成後,a將不存在,因爲它只在本地作用域中創建。

不,垃圾回收不會發生,因爲a(分配給值self.a)不是唯一的參考;你仍然有self.a它保持分配給它的值活着。

+2

分配給新變量可能不是一個好主意,如果它有文本或數字(int,float)和你爲本地變量分配新值,並且你期望在'self.'變量中有相同的值。 – furas

+2

執行此任務的第三個原因是在多線程場景中獲得「一致讀取」。如果'a'是不可變的,但'self.a'可以隨時重新分配,並且'some_method'依賴於'a'的一致值(但不一定是當前值),則只讀一次到本地名稱中,並且只使用本地名稱可確保您獲得一致性,無需額外鎖定,但可能會導致陳舊過時。 – ShadowRanger

+0

@ShadowRanger不能說我遇到過這種情況,但是,你的解釋很有意義。 –