使用父类调用方法

时间:2015-02-28 03:14:38

标签: python class oop bioinformatics

我对面向对象的编程非常陌生,而且我无法理解如何管理具有相关数据的类之间的关系。

我试图代表一些有关生物的基因组信息,我最终会对此进行比较。所以我有一个Species类:

class Species(object):
    def __init__(self, species_name, genes={}, contigs={}):
        self.species_name = species_name
        self.genes = genes
        self.contigs = contigs

然后我想要Gene班,

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

我们的想法是genes的{​​{1}}方法将是Species个对象的字典,其中关键字是Gene的{​​{1}}。我想我知道如何实现这一部分。

但我希望能做的其中一件事就是在locus_tag对象上调用一个函数,该函数需要知道它所在的Gene(它会输出)包含GeneSpecies的文件结构,但它们来自两个不同的类。我能想到的最简单的事情是将species_name直接添加到{{1} }},但由于每个locus_tag都在species_name范围内,这似乎是多余的。

我甚至不确定从哪里开始 - 我做了很多搜索,但我发现的其他问题要么不相关,要么我不太了解,无法掌握相关性。

2 个答案:

答案 0 :(得分:1)

创建Gene个对象,然后通过传递Species的字典来创建genes对象,然后通过设置Gene实例来更新Species个对象对它,像这样:

for gene in genes:
    gene.species = species

之后,每个Gene实例(gene)可以通过Speciesself.species引用其self.species.species_name对象来获取名称

答案 1 :(得分:1)

我通常不会做你所描述的事情。它创建一个循环引用,应尽可能避免。对象通常应具有层次关系。您应该尝试找到一种方法将基因和物种参考保存在一起,您可能需要将其序列化。

为了能够序列化基因,你可以编写一个以物种和基因为参数的函数。例如

# 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)