我有一个嵌套类:
class WidgetType(object):
class FloatType(object):
pass
class TextType(object):
pass
..和一个引用嵌套类类型(不是它的实例)的对象,就像这样
class ObjectToPickle(object):
def __init__(self):
self.type = WidgetType.TextType
尝试序列化ObjectToPickle类的实例会导致:
PicklingError:无法挑选<class'setmanager.app.site.widget_data_types.TextType'>
有没有办法在python中腌制嵌套类?
我有一个通常存储腌制类类型的系统.
我希望能够以相同的方式保存动态参数化的类,但我不能,因为我试图挑选一个非全局发现的类(未在简单代码中定义)得到PicklingError.
我的问题可以建模为以下示例代码:
class Base(object):
def m(self):
return self.__class__.PARAM
def make_parameterized(param_value):
class AutoSubClass(Base):
PARAM = param_value
return AutoSubClass
cls = make_parameterized(input("param value?"))
Run Code Online (Sandbox Code Playgroud)
当我尝试挑选该类时,我收到以下错误:
# pickle.PicklingError: Can't pickle <class '__main__.AutoSubClass'>: it's not found as __main__.AutoSubClass
import pickle
print pickle.dumps(cls)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一些方法来声明Base作为一个ParameterizableBaseClass应该定义所需的params(PARAM在上面的例子中).cls然后,通过保存"ParameterizableBaseClass"类型和不同的param值(param_value上面的动态),可以选择动态参数化子类(上面).
我相信在很多情况下,这可以完全避免......我可以在我的代码中避免这种情况,如果我真的(真的)必须这样做的话.我正在玩__metaclass__,copyreg甚至__builtin__.issubclass在某些时候(不要问),但是无法破解这个.
如果我不问的话,我觉得我不会忠于蟒蛇精神:如何以相对干净的方式实现这一目标?