設置
說我有一個Snit
:自動刪除類的實例時,它的屬性中的一個變成死
class Snit(): pass
而一個Snot
,其中包含了,比如說弱引用,四Snit
小號:
import weakref
class Snot():
def __init__(self,s1=None,s2=None,s3=None,s4=None):
self.s1 = weakref.ref(s1)
self.s2 = weakref.ref(s2)
self.s3 = weakref.ref(s3)
self.s4 = weakref.ref(s4)
我也有一個Snot
工廠:
def snot_factory(snits,w,x,y,z):
return Snot(snits[w],snits[x],snits[y],snits[z])
和Snit
S(snit_list
因爲它是)一個list
:
snit_list = []
for i in range(12):
snit_list.append(Snit())
現在我做的使用Snit
小號Snot
個名單在我snit_list
:
snot_list = []
for i in range(3):
snot_list.append(snot_factory(snit_list[4*i],snit_list[4*i+1],snit_list[4*i+2],snit_list[4*i+3]))
問題
哎呀!我不需要snit_list[3]
了,所以我會繼續前進,將其刪除:
snit_list.pop(3)
但現在我有一個Snot
掛在那裏與死Snit
:
snot_list[0].s4 # <weakref at 0x00BlahBlah; dead>
這可受不了!一個Snot
與一個死者Snit
是 - 顯然 - 總廢話。
所以我真的很想在的一個或多個銷燬後,至少返回None
作爲Snot
的任何引用。但理想情況下,Snot
會自動從snot_list
列表中移除(len(snot_list)
縮小刪除的Snot
s的數量)會更好。
這是怎麼回事?
澄清:
甲Snot
是一個對象時,有一組有效的Snit
S(「有效」意味着它具有相同數量的定義Snit
的s時,有初始化所用)應僅存在,用以下行爲:
- 如果在
Snot
任何一個Snit
消失(沒有強引用保持),該Snot
也應該消失(這就是爲什麼我設置了s1
,s2
等是弱引用)。請注意,Snot
可能已用4,3,2或1Snit
初始化。Snit
s的數量並不重要,的死亡的Snit
是重要的。 - 如果包含對
Snit
的引用的任何一個Snot
消失,則保留Snit
。 - OPTIONAL:當一個
Snot
被刪除,含有參考Snot
對象的數據結構被更新,以及(在Snot
得到pop
PED) - OPTIONAL:當ALL引用該
Snots
一定Snit
都消失,Snit
也會消失,並且包含該Snit
的任何數據結構都被更新爲#3(Snit
得到pop
ped)。
所以理想的解決方案將允許我做一些事情,這樣我可以寫這樣的代碼:
snits = get_snits_list(some_input_with_10000_snits)
snots = get_snots_list(some_cross_referenced_input_with_8000_snots)
#e.g.: the input file will say:
#snot number 12 is made of snits 1, 4, 7
#snot number 45 is made of snits 8, 7, 0, 14
do_stuff_with_snits()
snits.pop(7) #snit 7 is common to snot 12 and 45
assert len(snots) == 7998 #snots 12 and 45 have been removed
但是,如果這是太辛苦了,我會罰款:
assert snots[12] == None
assert snots[45] == None
我願意改變一些東西。例如,如果它使設計更容易,我認爲可以刪除對Snit
的弱引用,或者將它們移動到Snit
的列表中,而不是讓Snot
成員成爲弱引用(儘管我沒有看到這些改變如何改善事情)。
我也曾考慮創建Snot
子類 - , S,GreenSnot
與3
Snit`s,等我不確定這是否會令事情變得更容易維護,或更加困難。
如果任何人想知道這個問題是否僅僅是使用snot_factory的策略,答案可能是肯定的。 – 2014-11-20 23:11:50
簡而言之,沒有。 ;-) – martineau 2014-11-20 23:22:49
你能說清楚你是否想要訪問被刪除的屬性Snit'snots [0] .s4'返回None,Snot本身在成員丟失時返回None,還是其他? – bjornsen 2014-11-20 23:27:12