如何在python中从列表创建多个子类?

如何在python中从列表创建多个子类?,python,subclass,Python,Subclass,我试图以分层的方式获取数据,所以我决定转向子类。我从中获取数据的文件格式如下: 2WQZ_chain_A Score = 338.0 53-164 208-317 327-595 611-654 2WQZ_chain_B Score = 344.0 53-164 205-317 327-595 611-655 2XB6_chain_A Score = 319.0 64-163 211-317 327-596 613-654 2XB6_chain_B Score = 329.0 53-163

我试图以分层的方式获取数据,所以我决定转向子类。我从中获取数据的文件格式如下:

2WQZ_chain_A
Score = 338.0
53-164
208-317
327-595
611-654

2WQZ_chain_B
Score = 344.0
53-164
205-317
327-595
611-655

2XB6_chain_A
Score = 319.0
64-163
211-317
327-596
613-654

2XB6_chain_B
Score = 329.0
53-163
212-317
327-596
613-654
def parse_block(lines):
    pdb_name = lines[0][:4]
    chain = lines[0][5:]
    score = lines[1].split("=")[1].strip()
    intervals = lines[2:]
    return (pdb_name, chain, score, intervals)
{'2WQZ': {'chain_A': {'intervals': ['53-164', '208-317', '327-595', '611-654'],
                      'score': '338.0'},
          'chain_B': {'intervals': ['53-164', '205-317', '327-595', '611-655'],
                      'score': '344.0'}},
 '2XB6': {'chain_A': {'intervals': ['64-163', '211-317', '327-596', '613-654'],
                      'score': '319.0'},
          'chain_B': {'intervals': ['53-163', '212-317', '327-596', '613-654'],
                      'score': '329.0'}}}
我想得到的是一个名为PDB name的第一个类(即:2WQZ),其中的子类名为chain_a、chain_B等等。这些子类应该包含一个名为“score”的对象和第三个名为“interval”的子类,其中包含可能的间隔。总的想法是这样的

目前,我尝试使用字典,但最终得到了正确的PDB类,但只有第二个链,我的代码是

class PDB(object):
    def __init__(self, pdbname):
        self.pdbid = pdbname

class Chain(PDB):
    def __init__(self, chainame,  score, pdbname):
        self.chainid = chainame
        self.score = score
        super().__init__(pdbname)



making_class = open("covered_intervals.txt", "r").readlines()

pdblist = []

for i in making_class:
    if "chain" in i:
        pdblist.append(i[:4])

pdblist = list(dict.fromkeys(pdblist))
pdblist2 = dict.fromkeys(pdblist)

for i in pdblist:
    pdblist2[i] = PDB(i)
    for j in making_class:
        if i in j:
            chainame = j[5:12]
            pdblist2[i] = Chain(chainame, 4, i)

4是一个占位符,我明白为什么我只得到最后一个链,但不知道如何在同一个PDB下获得两个链。

首先,我建议创建一些东西,可以将文件中的一个文本块解析为可用变量,例如:

2WQZ_chain_A
Score = 338.0
53-164
208-317
327-595
611-654

2WQZ_chain_B
Score = 344.0
53-164
205-317
327-595
611-655

2XB6_chain_A
Score = 319.0
64-163
211-317
327-596
613-654

2XB6_chain_B
Score = 329.0
53-163
212-317
327-596
613-654
def parse_block(lines):
    pdb_name = lines[0][:4]
    chain = lines[0][5:]
    score = lines[1].split("=")[1].strip()
    intervals = lines[2:]
    return (pdb_name, chain, score, intervals)
{'2WQZ': {'chain_A': {'intervals': ['53-164', '208-317', '327-595', '611-654'],
                      'score': '338.0'},
          'chain_B': {'intervals': ['53-164', '205-317', '327-595', '611-655'],
                      'score': '344.0'}},
 '2XB6': {'chain_A': {'intervals': ['64-163', '211-317', '327-596', '613-654'],
                      'score': '319.0'},
          'chain_B': {'intervals': ['53-163', '212-317', '327-596', '613-654'],
                      'score': '329.0'}}}
使用它,您可以构建类,或者使用嵌套字典,这样也可以很好地适应数据结构

from collections import defaultdict

with open("pdbdata", "r") as f:
    content = f.read()

pdb_dict = defaultdict(dict)

for block in content.split("\n\n"):
    pdb_name, chain, score, intervals = parse_block(block.splitlines())
    pdb_dict[pdb_name][chain] = {"score": score, "intervals": intervals}
生成的嵌套dict如下所示:

2WQZ_chain_A
Score = 338.0
53-164
208-317
327-595
611-654

2WQZ_chain_B
Score = 344.0
53-164
205-317
327-595
611-655

2XB6_chain_A
Score = 319.0
64-163
211-317
327-596
613-654

2XB6_chain_B
Score = 329.0
53-163
212-317
327-596
613-654
def parse_block(lines):
    pdb_name = lines[0][:4]
    chain = lines[0][5:]
    score = lines[1].split("=")[1].strip()
    intervals = lines[2:]
    return (pdb_name, chain, score, intervals)
{'2WQZ': {'chain_A': {'intervals': ['53-164', '208-317', '327-595', '611-654'],
                      'score': '338.0'},
          'chain_B': {'intervals': ['53-164', '205-317', '327-595', '611-655'],
                      'score': '344.0'}},
 '2XB6': {'chain_A': {'intervals': ['64-163', '211-317', '327-596', '613-654'],
                      'score': '319.0'},
          'chain_B': {'intervals': ['53-163', '212-317', '327-596', '613-654'],
                      'score': '329.0'}}}

在这种情况下,可以为顶部节点创建一个字典,因为它是一个固定深度的树,所以不需要类嵌套。链类将有三个组件

  • 链名
  • 得分
  • 范围列表-我为范围实现了一个类

  • 非常感谢,您能详细说明一下如何实际生成正确的子类吗?我是新来的topic@FrancescoOliva我不认为继承是正确的工具。您可以创建具有所需属性的独立类,并使用组合来连接它们。例如,
    PDB
    类可以有一个属性
    chains
    ,即
    Chain
    对象的列表。这正是我要查找的。非常感谢你!请注意:range1类中有一个错误。在您编写时,它只打印正在考虑的间隔的第一个和第二个字符(即:53-164变为5和3)。self.start=int(str[0])和self.end=int(str[1])应该是self.start=int(x[0])和self.end=int(x[1])