腌制一个类时,将 __腌制该类
的 名称
,而不是其值。如果
class_decorator返回一个 名称 未在模块顶层定义的新类,则会出现错误:
PicklingError: Can't pickle <class '__main__.new_cls'>: it's not found as __main__.new_cls
您可以通过将新修饰的类命名为未修饰的类来避免该错误:
new_cls.__name__ = cls.__name__
然后代码运行无误:
import pickledef class_decorator(cls): class new_cls(cls): def run(self, *args, **kwargs): print 'In decorator' super(new_cls,self).run(*args, **kwargs) new_cls.__name__ = cls.__name__ return new_cls@class_decoratorclass cls(object): def run(self): print 'called'a = cls()print(a)# <__main__.cls object at 0x7f57d3743650>a.run()# In decorator# calleds = pickle.dumps(a)# Note "cls" in the `repr(s)` below refers to the name of the class. This is# what `pickle.loads` is using to unpickle the stringprint(repr(s))# 'ccopy_regn_reconstructornp0n(c__main__nclsnp1nc__builtin__nobjectnp2nNtp3nRp4n.'b = pickle.loads(s)print(b)# <__main__.cls object at 0x7f57d3743690>b.run()# In decorator# called



