Python:保存动态创建的对象类型

时间:2011-03-18 08:00:52

标签: python django class types

我正在使用类型函数动态创建一些对象类型。实施例

return type('DynamicType', (object,), dict)

dict取决于用户输入。现在我希望我能够保存这个返回的类类型,并在不同的会话中使用相同的类。一种可能的方法是将dict保存为文本(或数据库)并再次从该dict创建此对象类型。但有没有其他方法可以直接保存“类型”?

7 个答案:

答案 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服务器和客户端之间进行通信,但不仅限于该问题域。(...)“

JSON Module at 'Python Module of The Week' website

答案 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,只保存实例数据(包括类型的元数据)。你想要做的就是保存课程。您可以使用字节代码魔术来构建一些东西,但实现自己的序列化代码可能更容易。