2016-07-26 51 views
-2
class Myclass(object): 
    def get_val(self): 
     return 100 

my_obj = MyClass() 
data = { 
    'key_1': my_obj, 
    ... # other fields 
} 

後來我需要改變它的值的對象,我只能遍歷字典是這樣,也許遞歸:Python:對象是否可以改變自己到別的東西?

for key in data: 
    if type(data[key]) is MyClass: 
     data[key] = data[key].get_val() 

但有可能通過my_obj本身做到這一點?

我不這麼認爲,因爲在python中你不能操縱指針,就像你可以在c中做的一樣,但是有沒有更好的方法?

+0

該對象本身不能這樣做,儘管字典的子類可以覆蓋它很容易處理'data [key]'查找的方式。 –

+0

如前所述,您可以在班級中重複使用各種魔術方法返回特定值 – 2016-07-26 07:37:50

+2

爲什麼您需要首先執行此操作? –

回答

0

對象不能用其他東西替換任何/所有的自身引用。期。

不過,如果你需要有指針對象的字典(有某種形式的.get()方法返回的實際數據)然後就覆蓋一個dict子類的__getitem__方法從檢索數據時,將讓你在適當的邏輯加字典:

class MyDict(dict): 
    def __getitem__(self,item): 
     value = dict.__getitem__(self,item) #may raise error 
     if isinstance(value, Myclass): 
      return value.get_val() 
     else: 
      return value 

my_obj = Myclass() 

data = MyDict({ 
    'key_1': my_obj, 
    # other fields 
}) 

assert data["key_1"] == 100 

雖然注意,這僅是改變查找一個方法,使用.items().get()等將不使用修改後的__getitem__這樣一個更完整的實現可以用collections.MutableMapping來完成:

import collections 

class MyDict(collections.MutableMapping): 
    __slots__ = ["raw_dict"] 
    def __init__(self,*args,**kw): 
     self.raw_dict = dict(*args,**kw) 

    def __getitem__(self,item): 
     value = self.raw_dict[item] 
     if isinstance(value, Myclass): 
      return value.get_val() 
     return value 

    def __setitem__(self,item, value): 
     self.raw_dict[item] = value 
    def __delitem__(self, item): 
     del self.raw_dict[item] 
    def __len__(self): 
     return len(self.raw_dict) 
    def __iter__(self): 
     return iter(self.raw_dict) 

然後將所有其它的方法,如.get.pop和和.items等,均應從這裏定義的那些創建。原始指針對象仍然可以通過data.raw_dict["key_1"]訪問,所以沒有任何東西被隱藏/丟失。

相關問題