Python上元组派生类的自定义酸洗

Python上元组派生类的自定义酸洗,python,python-3.x,pickle,Python,Python 3.x,Pickle,我有一个类记录,它通过主键ID引用数据库记录,并保留一些缓存信息 class Record: def __init__( self, id ): self.id = id self.various_cached_info = spam 我还有一个类RecordCollection,它是记录的元组 from typing import Tuple, TypeVar TRecord = TypeVar( "T

我有一个类
记录
,它通过主键ID引用数据库记录,并保留一些缓存信息

    class Record:
        def __init__( self, id ):
            self.id = id
            self.various_cached_info = spam
我还有一个类
RecordCollection
,它是
记录的元组

    from typing import Tuple, TypeVar

    TRecord = TypeVar( "TRecord", bound = Record )

    class RecordCollection( Tuple[TRecord, ...] ):
        pass
现在,当我pickle一个
RecordCollection
时,如何将这个类更改为只pickle id
(作为
int的列表

我试过:

  • 更改
    Record.\uuuu getstate\uuuu
    以仅包含ID,并放弃缓存的信息。这会有所帮助,但是
    RecordCollection
    仍然会为数组中的每个项pickle类型名称“
    Record
  • 更改
    RecordCollection.\uuuu getstate\uuuu
    以仅包括ID列表,但引擎盖后面的某些东西正在其他地方腐蚀
    元组

您可以对int的tuple
tuple(i.id表示l中的i)使用tuple理解,也可以对int的列表
[i.id表示l中的i]
使用列表理解。这两种方法都不需要您以任何方式更改类。如果您真的想将其添加到类中,您可以创建一个名为
ids(self)
的方法,并让它返回ID。所以您的类看起来像
classrecordcollection(Tuple[TRecord,…]):;def id(self):;返回元组(在self中i的i.id)
,然后像调用
l.id()
一样调用它。
    import json
    import jsonpickle

    a = Record( 1 )
    b = Record( 2 )
    c = Record( 3 )

    l = RecordCollection( (a, b, c) )

    print( json.dumps( json.loads( jsonpickle.dumps( l ) ), indent = 4 ) )