python - 扩展类不能被pickle

标签 python python-3.x class oop pickle

我设计了一种以编程方式从类继承的方法,所以基本上是扩展一个类。它工作得非常好。但是,我需要对类进行 pickle,这是不可能的,因为扩展类是在函数中定义的。

这是扩展类的玩具示例:

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'

有什么解决办法吗?我不一定需要用我的方式来扩展一个类。任何其他方式都是可以接受的,只要我最终能够pickle这个类。

最佳答案

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

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)

关于python - 扩展类不能被pickle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62592010/

相关文章:

类默认构造函数中的c++类

python - 将组的最后一个值替换为 NaN

python-3.x - 矢量化自定义 RGB -> 灰度转换

c++ - #include .h 和只声明 A 类之间的区别;在 C++ 中

django - 在 Django 中的表格中显示数据

python - 在python中循环访问字典的元素

java - 在一行中反序列化对象以获得接口(interface)属性?

python - 如何将我自己的 Cython 模块导入到 jupyter notebook

python linux时间戳到日期时间和反向

python - 添加新列并删除重复项,以逐列替换空值