所以,我有这段代码
import itertools
def parse_dssp(dsspfile):
dssp={}
fdssp=open(dsspfile)
c=0
for line in fdssp:
if line.find(' # RESIDUE')==0:
c=1
continue
if c==1:
ch=line[11]
num=line[5:10].strip()
res=line[13]
ss=line[16]
if ss==' ':ss='C'
el=(ch,num,res,ss)
asa=float(line[35:38].strip())
phi=float(line[103:109].strip())
psi=float(line[109:115].strip())
dssp[el]=[asa,phi,psi]
return dssp
def interaction_surface(mono1,mono2,comp):
count_trimer=sum([mono2.ot[i][0] for i in mono2 if i[0]==mono1.name])
count_comp=sum([comp[i][0] for i in comp if i[0]==mono1.name])
return abs(count_trimer-count_comp)
class monomer:
def __init__(self,name,monomer,opposite_trimer):
self.mono=monomer
self.name=name
self.ot=opposite_trimer
def __iter__(self):
for each in self.ot.keys():
yield self.ot.__getattribute__(each)
A=monomer('A',parse_dssp('A.dssp'),parse_dssp('BCD.dssp'))
B=monomer('B',parse_dssp('B.dssp'),parse_dssp('ACD.dssp'))
C=monomer('C',parse_dssp('C.dssp'),parse_dssp('ABD.dssp'))
D=monomer('D',parse_dssp('D.dssp'),parse_dssp('ABC.dssp'))
ABCD=parse_dssp('ABCD.dssp')
chains=[A,B,C,D]
mono=[A,B,C,D]
for m1,m2 in itertools.combinations(mono, 2):
print(interaction surface(m1,m2,ABCD))
我需要解析DSSP文件并获得分子中各种单体之间的相互作用表面。在函数interaction_surface(mono1,mono2,comp)
中,我需要查看每个复合物中正在分析的单体的名称(i[0]
)是否与mono1的名称相对应,因此我认为我可以使用一个类并创建属性“名称”。
这个问题是,当然,一个类是不可迭代的,所以我试图使self.ot成为可迭代的,但是还没有成功,Python只返回TypeError: 'builtin_function_or_method' object is not iterable
。关于如何实现这种效果,或者只是使整个代码更优雅,更容易流动的任何想法?