【发布时间】:2010-12-17 06:23:17
【问题描述】:
我目前正在用 Python 编写一个可以序列化用户定义类的序列化模块。为此,我需要获取对象的完整名称空间并将其写入文件。然后我可以使用该字符串重新创建对象。
例如假设我们在一个名为A.py的文件中有以下类结构
class B:
class C:
pass
现在假设my_klass_string 是字符串"A::B::C"
klasses = my_klass_string.split("::")
if globals().has_key(klasses[0]):
klass = globals()[klasses[0]]
else:
raise TypeError, "No class defined: %s} " % klasses[0]
if len(klasses) > 1:
for klass_string in klasses:
if klass.__dict__.has_key(klass_string):
klass = klass.__dict__[klass_string]
else:
raise TypeError, "No class defined: %s} " % klass_string
klass_obj = klass.__new__(klass)
我可以创建类 C 的实例,即使它位于模块 A 中的类 B 下。
以上代码相当于调用eval(klass_obj = A.B.C.__new__(A.B.C))
注意:
我在这里使用__new__(),因为我正在重构一个序列化对象并且我不想初始化该对象,因为我不知道该类的__init__ 方法采用哪些参数。我想在不调用 init 的情况下创建对象,然后再为其分配属性。
我可以通过任何方式从字符串创建 A.B.C 类的对象。我该如何走另一条路?即使类是嵌套的,如何从该类的实例获取描述类的完整路径的字符串?
【问题讨论】:
-
+1 提出一个有趣且解释清楚的问题。
标签: python serialization introspection