如何在 pickle 中使用 class 装饰器?
How to use class decorators with pickle?
我想使用 class 装饰器(不是函数装饰器!),例如
def class_decorator(cls):
class new_cls(cls):
def run(self, *args, **kwargs):
print 'In decorator'
super(new_cls,self).run(*args, **kwargs)
return new_cls
@class_decorator
class cls(object):
'''
a class
'''
def run(self):
print 'called'
并且能够 pickle 对象:
import pickle
a = cls()
a.run()
s = pickle.dumps(a)
然而picklereturns报错:
PicklingError: Can't pickle <class '__main__.new_cls'>: it's not found as __main__.new_cls
任何帮助将不胜感激!
当您 pickle class 时,class 的 name -- 不是它的值 -- 是
腌制。如果 class_decorator
returns 一个新的 class whose name is not defined at the
模块的顶层,然后你得到错误:
PicklingError: Can't pickle <class '__main__.new_cls'>: it's not found as __main__.new_cls
您可以通过将新修饰的 class 命名为与未修饰的 class 相同来避免错误:
new_cls.__name__ = cls.__name__
然后代码运行没有错误:
import pickle
def 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_decorator
class cls(object):
def run(self):
print 'called'
a = cls()
print(a)
# <__main__.cls object at 0x7f57d3743650>
a.run()
# In decorator
# called
s = 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 string
print(repr(s))
# 'ccopy_reg\n_reconstructor\np0\n(c__main__\ncls\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n.'
b = pickle.loads(s)
print(b)
# <__main__.cls object at 0x7f57d3743690>
b.run()
# In decorator
# called
我想使用 class 装饰器(不是函数装饰器!),例如
def class_decorator(cls):
class new_cls(cls):
def run(self, *args, **kwargs):
print 'In decorator'
super(new_cls,self).run(*args, **kwargs)
return new_cls
@class_decorator
class cls(object):
'''
a class
'''
def run(self):
print 'called'
并且能够 pickle 对象:
import pickle
a = cls()
a.run()
s = pickle.dumps(a)
然而picklereturns报错:
PicklingError: Can't pickle <class '__main__.new_cls'>: it's not found as __main__.new_cls
任何帮助将不胜感激!
当您 pickle class 时,class 的 name -- 不是它的值 -- 是
腌制。如果 class_decorator
returns 一个新的 class whose name is not defined at the
模块的顶层,然后你得到错误:
PicklingError: Can't pickle <class '__main__.new_cls'>: it's not found as __main__.new_cls
您可以通过将新修饰的 class 命名为与未修饰的 class 相同来避免错误:
new_cls.__name__ = cls.__name__
然后代码运行没有错误:
import pickle
def 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_decorator
class cls(object):
def run(self):
print 'called'
a = cls()
print(a)
# <__main__.cls object at 0x7f57d3743650>
a.run()
# In decorator
# called
s = 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 string
print(repr(s))
# 'ccopy_reg\n_reconstructor\np0\n(c__main__\ncls\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n.'
b = pickle.loads(s)
print(b)
# <__main__.cls object at 0x7f57d3743690>
b.run()
# In decorator
# called