我有一個 Python 代碼,其結構如下:
for i in range (0,N):
ClassInstance = A(params)
... #some operation that modify the attribute of the instance "ClassInstance" of the class "A"
A 是通過類組合關系鏈接到另一個類的類。
現在我想在每個回圈周期重置類的實體,并且:
- 我不想為每個周期創建一個具有不同名稱的新實體
- 我不想撰寫
A用于手動重置屬性的方法,因為它們很多,而且并非都在__init__方法中定義,而是散布在類的各種方法中。
我只是希望在每個回圈中,同一個舊實體呈現出與剛創建后相同的狀態;為此,我將繼續放置一個重置方法,A如下所示:
def reset(self, params):
self = A(params)
并修改代碼結構如下:
ClassInstance = A(params)
for i in range (0,N):
ClassInstance.reset(params)
... #some operation that modify the attribute of the instance "ClassInstance" of the class "A"
這是一種忘記 ClassInstance 以前歷史記錄的安全方法,在每個周期從 0 重新開始,還是有一些我沒有考慮的缺點?
PS 在線搜索我看到了一些以前的類似帖子(作為在 Python 中重置類的首選方式),但我想了解這種特定方式是否有效,以及在繼續操作時我是否應該注意某些事情。顯然,如果這種方法是解決我的問題的錯誤方法,那么適合我情況的其他方法/解決方案也很容易被接受(但在這種情況下,我想了解問題出在哪里)
uj5u.com熱心網友回復:
您必須了解=在分配給變數時運算子的作用,例如a=obj
這不會修改變數指向的物件。這只是設定變數將從那時起參考哪個物件,而保留舊物件。
所以ClassInstance = A()創建一個新物件并將其分配給變數ClassInstance
舊實體不再被參考,您無法再訪問它。所以在每個回圈中你都有一個新的實體。
此外,您不能通過self = A()將新物件分配給區域變數來重置實體self。參考的實體self沒有被觸及。而且,當方法回傳時,self 變數被釋放并且實體不再被參考,因此它被銷毀。
一般來說,分配給變數不會做任何事情。就像給物體貼上標簽一樣。self是一個像任何其他變數一樣的變數。沒有什么特別之處。
重置實體的唯一方法是手動設定其屬性。
(“物件”和“實體”在此背景關系中的含義相同)
順便說一句,你不能在 python 中實際銷毀物件。del a例如,您可以洗掉變數,但是當它們不再被參考時,物件會自動銷毀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337196.html
