这似乎有效。
class PickleableStaticMethod(object):
def __init__(self, fn, cls=None):
self.cls = cls
self.fn = fn
def __call__(self, *args, **kwargs):
return self.fn(*args, **kwargs)
def __get__(self, obj, cls):
return PickleableStaticMethod(self.fn, cls)
def __getstate__(self):
return (self.cls, self.fn.__name__)
def __setstate__(self, state):
self.cls, name = state
self.fn = getattr(self.cls, name).fn
诀窍是在从类中获得静态方法时,将其锁定。
备选方案:您可以使用元类化为所有静态方法.__parentclass__
赋予属性。然后,您可以子类化,Pickler
并为每个子类实例提供其自己的.dispatch
表,然后可以对其进行修改而不会影响全局调度表(Pickler.dispatch
)。进行酸洗,解酸和调用方法可能会更快一些。