我有一个类,我想根据参数以几种方式实例化对象。当我将文件路径传递给函数__init__
时,它应该从保存为pickle文件的对象中恢复所有参数。有没有什么聪明的办法来做到这一点,像self=load(...)
在__init__函数中初始化pickle中的对象
1
A
回答
4
在__init__
做你__init__
只口罩self=load(...)
当地self
变量,它不会更改的实例。
您可以改为在该类的__new__
方法中控制新实例的创建。
import pickle
class Pretty(object):
def __new__(cls, filepath=None, *args, **kwargs):
if filepath:
with open(filepath) as f:
inst = pickle.load(f)
if not isinstance(inst, cls):
raise TypeError('Unpickled object is not of type {}'.format(cls))
else:
inst = super(Pretty, cls).__new__(cls, *args, **kwargs)
return inst
你可以做拆封对象,以确保它实际上是你的类的实例的快速实例检查,否则,你可以期待的不良行为,如你的类的__init__
方法没有被调用。
1
正如另一个答案中所述,self = load(...)
只替换本地变量self
。相同的答案建议诉诸类的工作方法,但在Python中不是一个好习惯,因为重写此方法只能用于不可变类型。
相反,你应该使用一个factory,可在这种情况下是一个简单的函数:
def foo_factory(filename=None, *args, **kwargs):
if filename:
foo_factory.foo = pickle.load(filename)
else:
foo_factory.foo = Foo(*args, **kwargs)
return foo_factory.foo
,我们假设类Foo
是阶级的利益。
(见Why is __init__() always called after __new__()?的详细信息和参考文献)
相关问题
- 1. 函数初始化和对象初始化(多处理)
- 2. 在初始化函数中定义对象的条目
- 3. 在初始化中实例化对象?
- 4. 在ASP.NET Core中使用DI初始化初始化对象的对象
- 5. memset()在构造函数中初始化对象?
- 6. 在初始化列表中初始化引用对象成员
- 7. 对象初始化数组
- 8. 初始化父对象后初始化相关的对象
- 9. 对象初始化
- 10. 对象初始化
- 11. 初始化对象
- 12. 初始化对象
- 13. 在WCF中初始化对象一次
- 14. 在javascript中初始化'多维'对象
- 15. 在.net中初始化对象?
- 16. 在Perl中初始化一个对象
- 17. 在Ruby对象中初始化属性
- 18. 在C++中初始化对象
- 19. 在新对象中初始化模拟
- 20. 初始化对象直接在Java中
- 21. 正在初始化对象的数组
- 22. 正在初始化对象
- 23. 超在初始化对象
- 24. 初始化xcode 8中的Appdelegate对象
- 25. c中的对象重新初始化#
- 26. 如何初始化nsmutablearray中的对象?
- 27. C#中的对象初始化
- 28. 类对象中的结构初始化
- 29. 初始化方法中的对象 - MQL5
- 30. 初始化背景中的对象
请[编辑]你的问题,至少是增加一个例子'class'定义。 – martineau