2011-06-21 40 views
3

我有我認爲會是一個相當普遍的問題,但我似乎無法找到如何去做我想做的事情。從YAML加載序列化對象並用它替換當前對象

我有一個Python類,它有一些包含模型參數的實例變量。我已經添加了兩種方法的類:

def save_params(self, filename): 
    f = open(filename, "w") 
    yaml.dump(self, f, default_flow_style=False) 
    f.close() 

def load_params(self, filename): 
    f = open(filename, "r") 
    obj = yaml.load(f) 
    print obj.aero_soot 
    self = copy.deepcopy(obj) 
    f.close() 

我想用這些來此對象的屬性的值保存到YAML文件,然後加載它們從YAML文件回來。

save_params工作正常,但load_params沒有。它從YAML文件加載到obj,但obj中的屬性在對象的當前實例中不能正確設置(self)。

我可能在這裏做了一些愚蠢的事情,但它是什麼?

回答

1

問題出在您的任務self,它很好地解釋here。簡而言之,在函數中,self是一個本地名稱,因此將它綁定到不同的值對函數以外沒有影響。

要解決這個問題,你可以使用self.__dict__ = obj.__dict__。這隻有在您未對當前對象的__dict__進行任何修改時纔有效。

我會然而,推薦另一apporach:使加載和保存返回對象的功能,無論是免費的功能或類方法:

@classmethod 
def save_params(cls, obj, filename): 
    with open(filename, "w") as f: 
     yaml.dump(obj, f, default_flow_style=False) 

@classmethod 
def load_params(cls, obj, filename): 
    with open(filename, "r") as f: 
     obj = yaml.load(f) 
     print obj.aero_soot 
     return obj 
+0

謝謝你 - 這是有道理的。 有沒有另一種方法來做我想做的事情? (也就是說,創建簡單的方法來保存和恢復這個對象的屬性) – robintw

+0

我認爲你的意思是'__dict__'而不是'__dir__'。 –

+0

@Daniel:的確如此。謝謝並修復! –