Python 泡菜方法 __getnewargs__ 无效

Python pickle method __getnewargs__ not working

我的想法是扩展 datetime class,所以我可以用简单的 Day('20150208')

创建对象
from datetime import datetime
from pickle import dumps, loads

class Day(datetime):

    def __new__(cls, date):
        day = datetime.strptime(date, '%Y%m%d')
        return super().__new__(cls, day.year, day.month, day.day)

    def __str__(self):
        return datetime.strftime(self, '%Y%m%d')

    def __getnewargs__(self):
        print('__getnewargs__ called')
        return (self.__str__(), ) 

day = Day('20200506')
print(day)

问题是无法正确序列化此对象:

print(loads(dumps(day)))

给出:

TypeError: strptime() argument 1 must be str not bytes

同样有趣的是__getnewargs__里面的print语句没有被调用,所以好像__getnewargs__ itsef没有被调用。

如何解决?

我也用 __reduce__ 试过,但没用。

datetime 实现了 __reduce____reduce_ex__。这将取代 __getnewsarg__。你必须覆盖 __reduce_ex__:

from datetime import datetime
from pickle import dumps, loads

class Day(datetime):

    def __new__(cls, date):
        day = datetime.strptime(date, '%Y%m%d')
        return super().__new__(cls, day.year, day.month, day.day)

    def __str__(self):
        return datetime.strftime(self, '%Y%m%d')

    def __reduce_ex__(self, prot):
        return (self.__class__, (self.__str__(),))
        

day = Day('20200506')
print(day)

print(loads(dumps(day)))