我对面向对象的编程非常陌生,而且我无法理解如何管理具有相关数据的类之间的关系。
我试图代表一些有关生物的基因组信息,我最终会对此进行比较。所以我有一个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
(它会输出)包含Gene
和Species
的文件结构,但它们来自两个不同的类。我能想到的最简单的事情是将species_name
直接添加到{{1} }},但由于每个locus_tag
都在species_name
范围内,这似乎是多余的。
我甚至不确定从哪里开始 - 我做了很多搜索,但我发现的其他问题要么不相关,要么我不太了解,无法掌握相关性。
答案 0 :(得分:1)
创建Gene
个对象,然后通过传递Species
的字典来创建genes
对象,然后通过设置Gene
实例来更新Species
个对象对它,像这样:
for gene in genes:
gene.species = species
之后,每个Gene
实例(gene
)可以通过Species
或self.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)