我正在使用类型函数动态创建一些对象类型。实施例
return type('DynamicType', (object,), dict)
dict取决于用户输入。现在我希望我能够保存这个返回的类类型,并在不同的会话中使用相同的类。一种可能的方法是将dict保存为文本(或数据库)并再次从该dict创建此对象类型。但有没有其他方法可以直接保存“类型”?
答案 0 :(得分:3)
你不能挑剔课程,即使你解决了你的“...未找到...”问题它仍然无法正常工作(如保存课程名称,没有内容,则无法unpickle,因为程序重新启动后该类不存在)
你将不得不手动序列化dict并在以后重新构建它,这取决于它包含的内容也很有趣:函数对象不能被任何东西序列化,你必须提取它们的代码对象,序列化它们使用 marshal 然后在加载时重新创建它们。
答案 1 :(得分:2)
如何使用创建,pickle和unpickle动态创建的类型对象的方法创建Factory类?以下是一个粗略的开始。要使用,只需用TypeFactory.pickle(type,fh)替换对pickle.dump(type,fh)的调用,并用TypeFactory.unpickle(fh)替换对pickle.load(fh)的调用。
import pickle
class TypeFactory(object):
def __init__(self):
pass
@staticmethod
def create_type(name='DynamicType', dict={}):
return type(name, (object,), dict)
@staticmethod
def pickle(t, fh):
dict = t.__dict__.copy()
name = t.__name__
for key in dict.keys():
if key.startswith('__') and key.endswith('__'):
del dict[key]
pickle.dump((name, dict), fh)
@classmethod
def unpickle(cls, fh):
name, dict = pickle.load(fh)
return cls.create_type(name, dict)
答案 2 :(得分:1)
在python中,类也是对象。因此,您应该能够挑选类对象,并将它们保存到文件中。然后你可以在以后拆开它们。
答案 3 :(得分:0)
也许你可以试试json模块(注意:我自己没有使用它,所以我不知道它是否会解决你的问题,这只是一个建议):
“json模块提供类似于pickle的API,用于将内存中的Python对象转换为称为JavaScript Object Notation(JSON)的序列化表示。与pickle不同,JSON具有以多种语言实现的优势(特别是JavaScript)使其适用于应用程序间通信.JSON可能最广泛地用于在AJAX应用程序中在Web服务器和客户端之间进行通信,但不仅限于该问题域。(...)“
答案 4 :(得分:0)
将dict保存为JSON似乎最简单,但看起来像pickle或shelve可以用来创建某种动态类序列化。
快速搜索SO会显示这篇有用的帖子:getting the class path or name space of a class in python even if it is nested
答案 5 :(得分:0)
您可以在酸洗之前在全局命名空间中“注入”新类,以避免发生错误:
import pickle
class TestClass(object):
def __init__(self):
self.a = 1 # Initial instance attributes
self.b = 2
self.c = 3
my_classname = "NewTestClass"
obj = type(my_classname, (TestClass,), {})()
obj.d = 4 # Extra attributes
print obj.a, obj.b, obj.c, obj.d
print obj.__class__
globals()[my_classname] = obj.__class__ # Inject the new class in the global namespace
obj2 = pickle.dumps(obj)
obj = None # Free original obj instance
obj = pickle.loads(obj2)
print obj.a, obj.b, obj.c, obj.d # 1,2,3,4
答案 6 :(得分:0)
您的问题没有自动解决方案。所有“默认”机制,如pickle,只保存实例数据(包括类型的元数据)。你想要做的就是保存课程。您可以使用字节代码魔术来构建一些东西,但实现自己的序列化代码可能更容易。