繁体   English   中英

加长class不能腌制

[英]Extended class can't be pickled

我设计了一种以编程方式从 class 继承的方法,因此基本上扩展了 class。 它工作得很好。 但是,我需要腌制 class,这是不可能的,因为扩展的 class 是在 function 中定义的。

这是扩展 class 的玩具示例:

import pickle

class A():
    pass

def extend_class(base_class):
    class B(base_class):
        def hello(self):
            print('Yo!')

    return B

extended_class = extend_class(A)

b = extended_class()
b.hello()

但是,如果我这样做

pickle.dump(b, open('extended_class.pickle', 'w'))

这返回:

AttributeError: Can't pickle local object 'extend_class.<locals>.B'

任何解决方法? 我不一定需要使用我的方式来扩展 class。 任何其他方式都是可以接受的,只要我最终能腌制 class。

您可以在全局域中声明一个 class,然后在工厂 function 中将其声明为全局,然后覆盖它。
它看起来有点像 hack,可能有更好的方法(也许通过将 class 直接注入 class 字典),但尽管如此,它是:

import pickle

class A:
    pass

class _B:
    pass
B = _B

def extend_class(base_class):
    global B
    class B(base_class):
        def hello(self):
            print('Yo!')

    return B


if __name__ == '__main__':

    extended_class = extend_class(A)

    b = extended_class()
    b.hello()
    with open('tst.pickle', "wb") as f:
        pickle.dump(b, f)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM