2015-08-28 72 views
2

假設我們有一個對象a,我們要修改的數據是這樣的Python化的方式,以避免指針

a.substructure1.subsubstructure1.name_of_the_data1

a.substructure2.subsubstructure2.name_of_the_data2

結構要訪問這個結構我們稱之爲一個外部方法get_the_data_shortcut(a),它被大量參數化(例如參數subsstructure指定要返回哪個子結構)。這看起來非常冗餘,但對於所有這些參數都有一個非常好的默認設置,這是合理的。此外,如果默認分支不可用,此函數將返回另一個數據分支。

如何修改get_the_data_shortcut(a)

b = get_the_data_shortcut(a) 
b = b + 1 

然後,get_the_data_shortcut(a)不變,因爲還有Python是不是Java。

我需要一個setter嗎?大多數情況下,這不是我的代碼,並且是由編寫pythonic代碼的人編寫的,我試圖跟上這些標準。

+4

通常Python的辦法是做類似'B = A .substructure1.subsubstructure1; b.name_of_the_data1 + = 1'。但是,也許你應該寫一個[mcve],這樣我們就可以有更多的實際討論。 –

回答

1

正如您發現更改對象b指的是不會修改對象(或其子結構)。如果你想這樣做,你需要一個類似於你的get_the_data_shortcut(a)的方法。即

set_the_data_shortcut(a, newvalue) 

或者你可以有這將返回值存儲在底層結構和操作一個方法..

# returns a.substructure2.subsubstructure2 
#   or a.substructure1.subsubstructure1 based on the value of kind 
substruct = get_the_substructure(a, kind) 
substruct.name_of_data1 += 1 
1

Python使用引用類型,就像java一樣。 然而,當你做

b = b + 1 

你沒有更新你的對象。相反,您正在創建一個新對象並將其分配給變量b

如果你想在數據結構中更新b的值,你應該遵循你的建議併爲數據結構編寫一個setter。