我设计了一种以编程方式从类继承的方法,所以基本上是扩展一个类。它工作得非常好。但是,我需要对类进行 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/