Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用父类调用方法_Python_Class_Oop_Bioinformatics - Fatal编程技术网

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,用一个两个字母的前缀来表示物种,这会使它们独一无二,但伸缩性较差。最终,这些东西将被写入数据库(仍然需要了解它是如何工作的)。如果我理解正确,你是说在我的
基因
类中,如果我想找到物种名称,我应该进入数据库(在你的例子中是
文件对象
),而不是进入另一个类来了解它们之间的关系?