@ jasonharper, большое спасибо за объяснение в вашем комментарии! Функция Counter __reduce__
действительно кажется немного особенной. Например, функции __getstate__
, __setstate__
, __getnewargs__
и __getnewargs_ex__
не вызываются. Итак, переопределение __reduce__
похоже на go.
Вот переопределение, о котором вы говорите: https://github.com/python/cpython/blob/3.7/Lib/collections/ init .py # L697
Мне непонятно, почему Counter понадобится это. Фактически, восстановление его функции __reduce__
до функции dict, похоже, решает мою проблему:
from collections import Counter
import pickle
class DerivedCounter(Counter):
def __init__(self, *args, capacity: int = 10):
super().__init__(*args)
self._capacity = capacity
def __reduce__(self):
return dict.__reduce__(self)
dc = DerivedCounter(capacity = 200)
print("Original", dc._capacity)
print("Pickled", pickle.loads(pickle.dumps(dc))._capacity)
Теперь результат такой, как я ожидал:
Original 200
Pickled 200
И восстановленный объект кажется полностью неповрежденным с точки зрения его функции счетчика. Так что, может быть, переопределение __reduce__
в Counter устарело, если не вредно?
Еще раз спасибо!