我有一个由字符串、列表和两个整数组成的复合对象字典。
我正在遍历这本字典,执行一些测试,然后根据这些测试将当前测试的对象保存到一个新字典中,然后修改一些属性。到目前为止,这一直是对新字典中的对象的引用,因此当我更改某些属性时,旧对象也会更改,我想避免这种行为。
我尝试使用复制模块中的copy.copy
andcopy.deepcopy
方法,但由于某种原因,复制后我无法更改属性。它们将保持原样。
我应该说我对 OOP 很陌生,所以将任何建议都瞄准白痴级别!
所以在下面的代码中,pathways
是路径对象的字典,variants
只是一个列表。
names()
并且addMutant()
是属于通路对象的方法。
如果它有帮助:通路对象包含属于该通路的基因列表(也是另一个对象)。我想找出变体列表(基因名称列表)中表示哪些途径,然后返回一个新的(较小的)途径字典,该字典将被修改以记录每个途径中突变基因的数量。该addMutant()
方法只是增加一个属于通路对象的 int 属性。
def method(variants, pathways):
vpathways = {}
check = 0
for var in variants:
for k,v in pathways.iteritems():
if(var in v.names()):
check +=1
vpathways[k] = copy.deepcopy(v)
vpathways[k].addMutant()
return(vpathways)
当我这样做的时候,vpathways 确实包含了正确的路径,但是每个路径的突变数量仍然是 0。我在 addMutant() 方法中添加了一个打印语句,它肯定被调用了,以及突变的数量属性增加,但不是在最终对象中。
编辑:途径类定义:
class Pathway():
def __init__(self, pid = None, genes = [],nmut = 0 ):
self.pid = pid
self.genes = genes
self.length = 0
self.nmut = nmut
for g in self.genes:
self.length += g.seqlen
def __str__(self):
return('{0} pathway containing {1} genes, with a total sequence length of {2} and {3} mutations'.format(self.pid, len(self.genes), self.length, self.nmut))
def __repr__(self):
return self.__str__()
def addGene2Pathway(self,g):
self.genes.append(g)
self.length += g.seqlen
def addMutant(self):
self.nmut +=1
def names(self):
l = []
for g in self.genes:
l.append(g.entrezid)
return l