我有一個類,我想根據參數以幾種方式實例化對象。當我將文件路徑傳遞給函數__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. 在C lambda函數初始化對象++
- 2. 在C++中初始化對象數組
- 3. 函數初始化和對象初始化(多處理)
- 4. 在函數中初始化的對象上的RSpec any_instance stubbing
- 5. 在初始化函數中定義對象的條目
- 6. 在初始化中實例化對象?
- 7. 請參考初始化中正在初始化的對象嗎?
- 8. 在ASP.NET Core中使用DI初始化初始化對象的對象
- 9. 在其他類構造函數中初始化類對象
- 10. memset()在構造函數中初始化對象?
- 11. 在初始化列表中初始化引用對象成員
- 12. 對象初始化數組
- 13. 對象初始化數組
- 14. 初始化數組對象
- 15. 初始化在定義與初始化在構造函數中
- 16. 在函數中初始化,並沒有在主要初始化
- 17. 如何使用函數指針初始化類中的對象?
- 18. 對象初始化程序中的函數和屬性用法
- 19. 構造函數與C中的對象初始化優先級#
- 20. 遇到問題初始化對象的ArrayList構造函數中
- 21. Arduino:初始化構造函數中的自定義對象
- 22. 統一初始化不會在構造函數初始化父對象工作
- 23. 初始化父對象後初始化相關的對象
- 24. 初始化對象
- 25. 對象初始化
- 26. 初始化對象
- 27. 初始化對象
- 28. 對象初始化
- 29. 在rails中初始化關聯對象
- 30. 在Ruby對象中初始化屬性
請[編輯]你的問題,至少是增加一個例子'class'定義。 – martineau