设置
说我有一个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