【发布时间】:2019-05-17 04:57:16
【问题描述】:
我正在使用装饰器来扩展某些类并向它们添加一些功能,如下所示:
def useful_stuff(cls):
class LocalClass(cls):
def better_foo(self):
print('better foo')
return LocalClass
@useful_stuff
class MyClass:
def foo(self):
print('foo')
不幸的是,由于非全局 LocalClass
,MyClass 不再是 pickleableAttributeError: Can't pickle local object 'useful_stuff.<locals>.LocalClass'
- 我需要腌制我的课程。你能推荐一个更好的设计吗?
- 考虑到一个类可以有多个装饰器,通过让 MyClass 继承所有功能来切换到多重继承会是更好的选择吗?
【问题讨论】:
-
我听说有一个包叫
dill可以腌制比pickle更多的东西。 -
我想我会为这个用例使用继承或元类
-
使用元类会起作用吗?
-
这里似乎没有任何理由使用装饰器。只需将
LocalClass声明为全局可见的基类,并让MyClass直接从它继承,而不是装饰MyClass。解决用多个基类替换多个装饰器的问题需要更详细地了解装饰器做什么才能提供好的答案。 -
多重继承的主要问题是数据属性冲突;如果您从混合中继承的只是一个方法,则任何冲突都将由 MRO 解决。您的装饰师只是以不同的方式创建相同的 MRO。
标签: python python-3.x pickle python-decorators