Python 使用父类调用方法
我对面向对象编程非常陌生,我很难理解如何管理具有相关数据的类之间的关系 我试图表达一些关于一系列生物体的基因组信息,我最终会比较这些信息。所以我有一个Python 使用父类调用方法,python,class,oop,bioinformatics,Python,Class,Oop,Bioinformatics,我对面向对象编程非常陌生,我很难理解如何管理具有相关数据的类之间的关系 我试图表达一些关于一系列生物体的基因组信息,我最终会比较这些信息。所以我有一个物种类: class Species(object): def __init__(self, species_name, genes={}, contigs={}): self.species_name = species_name self.genes = genes self.contig
物种
类:
class Species(object):
def __init__(self, species_name, genes={}, contigs={}):
self.species_name = species_name
self.genes = genes
self.contigs = contigs
然后我想上一门基因课
class Gene(object):
def __init__(self, locus_tag, annotation, dna_seq, aa_seq):
self.locus_tag = locus_tag
self.annotation = annotation
self.dna_seq = dna_seq
self.aa_seq = aa_seq
其想法是物种的基因方法将是基因
对象的字典,其中关键是基因
的位点标签
。我想我知道如何实现这一部分
但是我希望能够做的一件事是调用基因
对象上的函数,它需要知道它在物种
中(它将输出一个文件结构,其中包括物种名称
和位点标签
,但它们来自两个不同的类。我能想到的最简单的事情是将物种名称
直接添加到基因
类中,但由于每个基因
都位于物种
中,因此这似乎是多余的
我甚至不知道从哪里开始——我做了很多搜索,但我发现的其他问题要么不相关,要么我理解得不够,无法把握相关性。创建基因
对象,然后通过传递基因
词典创建物种
对象,然后更新基因通过将物种
实例设置为对象,如下所示:
for gene in genes:
gene.species = species
之后,每个基因
实例(基因
)可以通过执行self.Species
或,例如,self.Species.Species\u name
来引用其Species
对象以获取名称。我通常不会按照您所描述的那样做。它会创建一个循环引用,这应该尽可能避免。对象通常应该具有层次关系。您应该我会设法找到一种方法,把一个基因和一个物种的参考放在一起,这样你可能需要对它进行序列化
为了能够序列化一个基因,你可以编写一个函数,将一个物种和一个基因作为参数
# if using python 2 (I think you might be)
from __future__ import print_function
class Species(object):
def __init__(self, species_name, genes={}, contigs={}):
self.species_name = species_name
self.genes = genes
self.contigs = contigs
def serialise(self, fileobj):
for gene in self.genes.values():
self.serialise_gene(gene, fileobj)
def serialise_gene(self, gene, fileobj):
print(self.name, gene.locus_tag, sep=", ", file=fileobj)
# prints "name, locus_tag" to the file
s = Species("homo erectus")
with open("some_file.txt", "w") as f:
s.serialise(f)
我假设你写的所有系列
这里你指的是物种
?所以如果我理解正确的话,它有点无限嵌套?所以原则上我可以做基因.物种.基因[位点标签].species.genes…
等无穷大?@kevbonham:是的,我的意思是物种
-我已经更新了答案。你确实可以继续分配,但如果你避免这样做,对你的代码可能更好。但是,这会起作用,因为你仍然在处理对象,你可以分配给它们。每个物种
实例都有唯一的名称吗?作为旁注。切勿将可变对象用作默认参数。如果需要提供默认可变参数,请执行以下操作。def\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuoself,物种名称
@wwii是的,每个物种都是唯一的。可能有名称相同的基因,但它们的位点标签
将是唯一的。基因
实例(具有相同的位点标签
)是否包含在多个物种
实例中?@wwii I正要说不,但我意识到这可能不正确-一些位点标记
只是数字,它们被分配在物种
中,独立于其他物种
。因此在另一个位点标记
物种是一样的,虽然这并不意味着它们之间的关系。我想我可以通过重写locus\u标签
s,用一个两个字母的前缀来表示物种,这会使它们独一无二,但伸缩性较差。最终,这些东西将被写入数据库(仍然需要了解它是如何工作的)。如果我理解正确,你是说在我的基因
类中,如果我想找到物种名称,我应该进入数据库(在你的例子中是文件对象
),而不是进入另一个类来了解它们之间的关系?