2011-06-22 34 views
2

我需要能夠將對象的任何字符串表示形式轉換回另一臺計算機上的原始狀態。我將使用類A作爲示例:Python中的對象字符串

class A: 
     def __init__(self): 
      self.data = "test" 
      self.name = "Bob" 

     def __str__(self): 
      return str(self.data) + " " + str(self.name) 

類A的對象必須能夠在單獨的計算機上重新創建。因此,如果一臺單獨的計算機收到(「A」,「memberData memberName」),它可以將其轉換爲A類的對象。我需要這可以與任何用戶定義的對象一起使用。最好我希望用戶只需要創建一個toString()和toObject()方法。

回答

11

您正在尋找在序列化的對象的方式;這是一個非常標準的問題。 pickle是標準解決方案,您應該首先查看它。如果您希望創建一個類,那麼您需要在其上定義一些自定義方法,並確保可以在源計算機和目標計算機上找到定義它的模塊。然後你可以pickle.dumps(obj)這將返回一個字符串,pickle.loads(my_str)重建對象。

其他選項包括marshal(低級)和json(網絡數據標準)。

1

泡菜和擱架可能是有用的。例如。

import shelve 

a = A(); 

db = shelve.open('myclasses') 
db['a'] = a 
db.close() 

這將創建將存儲您的類的文件myclasses。

1

如果你想序列化和反序列化Python對象,pickle已經被指出了一個非常好的,標準的解決方案。 Python還使用repr來獲取用於構造等效對象的對象的字符串表示,其中可能是。在你的情況下,最簡單的方法是添加dataname構造函數的參數,並定義使用數據成員的repr一個__repr__功能:

class A: 
    def __init__(self, data, name): 
     self.data = data 
     self.name = name 

    def __repr__(self): 
     return "%s(%s,%s)" % (self.__class__.__name__, repr(self.data), repr(self.name)) 

然後,你可以做

a = A('test', 'Bob') 
a_repr = repr(a) 
a_copy = eval(a_repr) 

等上。顯然,對於更大,更復雜的類來說,這將變得困難。

0

泡菜似乎是正確的選擇。

您可能想要使用dump()load()方法保存並從字符串獲取對象。

# The object to pickle 
object_pi = myDict  
# Dump the data as string to file 
pickle.dump(object_pi, filename) 

# The file with serialized data to retrieve 
fileHandler = open(filename, 'r') 
# The data is stored into my_object variable 
my_object = pickle.load(fileHandler) 

來源鏈接:snip2code - Using Pickle To Save Objects In Python

相關問題