Вам необходимо установить метаданные так, чтобы подкласс выглядел как оригинал:
def deco(cls):
class SubClass(cls):
...
SubClass.__name__ = cls.__name__
SubClass.__qualname__ = cls.__qualname__
SubClass.__module__ = cls.__module__
return SubClass
Классы выбираются с использованием их модуля и имени для записи, где найти класс.Ваш класс должен быть найден в том же месте, в котором находился бы исходный класс, если бы он не был оформлен, поэтому Pickle должен видеть тот же модуль и имя квалификации.Это похоже на то, что funcutils.wraps
делает для декорированных функций.
Однако, вероятно, было бы проще и менее подвержено ошибкам вместо добавления новых методов непосредственно в исходный класс вместо создания подкласса:
def better_foo(self):
print('better_foo')
def useful_stuff(cls):
cls.better_foo = better_foo
return cls