2014-06-19 144 views
1

我正在編寫一個程序,它由一個「主」對象組成,它跟蹤並操縱許多較小的對象。這裏是一個簡化的例子:如何訪問另一個對象內的對象的方法

class My_obj: 

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

    def set_a(self, a): 
     self.a = a 

    def get_a(self): 
     return self.a 

class Master: 

    def __init__(self, list_): 
     self.obj_list = [] 
     for value in list_: 
      obj = My_obj(value) 
      self.obj_list.append(obj) 

m = Master([0, 1, 2]) 

# How do I get (or set) the value of <a> from one of the My_obj instances 
# within the new Master object? 

我知道兩種方法來做到這一點。首先是要添加到Master一個方法,返回所請求的對象:

def get_obj(self, index): 
     return self.obj_list[index] 

然後我可以直接調用任何方法的對象。但是,這看起來很危險:如果後面的代碼刪除了返回的對象,然後Master中的某些內容試圖查找它,程序就會崩潰。

編輯: 原來,它不會崩潰,但仍然是一個問題;看評論。

第二種方法是將帶包裝的相應方法每種方法在Master

def set_a(self, index, a): 
     self.obj_list[index].set_a(a) 

    def get_a(self, index): 
     return self.obj_list[index].get_a() 

這似乎是多餘的,而且會得到相當繁瑣的更復雜的情形。

有誰知道更好的方法來訪問這些方法?

+1

「如果後續代碼刪除返回的對象,然後Master中的某些東西試圖查找它?那不可能真的發生。 Master對象仍然有對返回對象的引用,所以它不會被刪除。 – matt

+0

以簡單的方式做到這一點,如果您遇到問題,請稍後重構。 – monkut

+0

你已經提供了2種方法。我想你只是想要一個「安全」的方式來做到這一點?爲什麼你覺得第二種方式是多餘的?它不是非常詳細的imo .. – nave

回答

1
print m.obj_list[0].get_a() # prints 0 
m.obj_list[0].set_a(5) 
print m.obj_list[0].get_a() # prints 5 
# access all the "a"'s 
a_s = [o.get_a() for o in m.obj_list] 
+0

像這樣直接訪問對象屬性是否「正確」?我的印象是,應該主要用於調試,真正的代碼應該只使用方法。那是不正確的? – Matthew

+0

定義'正確的'...我想這個答案取決於你想要做什麼 - 這個例子有點難以理解。如果你想封裝(隱藏數據結構,但暴露數據),那麼你應該在'Master'中創建「冗餘」訪問方法,而如果你想要的只是一個嵌套的數據結構,你應該做,而不使用類和對象 – alfasin

相關問題