class Mammal(object):
def __init__(self):
super(Mammal, self).__init__()
self.dna_sequence = self.sequence_dna()
def sequence_dna(self):
blood_sample = 42
# Code goes here to sequence the mammal's DNA - may take a while.
然后,在另一堂课中,我想继承哺乳动物:
class Human(Mammal):
super(Human, self).__init__()
self.dna_sequence = self.sequence_dna()
def sequence_dna(self):
blood_sample = 43
# use blood sample and Human algo to sequence it.
所以这就是我被困住的地方。当我创建Human对象时,我不希望它去进行DNA测序,因为这需要一段时间。但我需要Human对象具有dna_sequence属性,以便我可以稍后进行排序。解决方案是在 init 方法中设置属性,但是在调用sequence_dna方法之前将其设置为None
?看起来像kludgy,特别是因为我有很多变量,所有变量都取决于DNA测序的结果,因此设置为无。
我觉得我错过了一块拼图...
答案 0 :(得分:6)
处理此问题的一种方法是lazy initialization。你可以做点什么..
class Mammal(object):
def __init__(self):
self.blood_sample = 42
self.dna_sequence = None
def get_dna_sequence(self):
if self.dna_sequence == None:
self.generate_dna_sequence(self.blood_sample)
return self.dna_sequence
def generate_dna_sequence(self, blood_sample=None):
self.dna_sequence = stuff_to_generate_sequence(blood_sample)
class Human(Mammal):
def __init__(self):
super(Mammal, self).__init__()
self.blood_sample = 43
然后,人类会自动继承'get_dna_sequence',但两个版本只会根据请求进行计算。
你可以通过使get_dna_sequence()方法变为generator来进一步对其进行操作,如果你正在进行的计算/映射可能被“分块”,那么你应该把它放出来。因为它正在被处理,所以你不必将整个东西保存在内存中。 (对于DNA,我认为这将是相当大的..)
答案 1 :(得分:1)
没有理由不能将变量初始化为None
。
可能缺少的那个难题是变量不应该是类的用户获取基因序列值的主要接口。让他们调用序列方法,如果序列方法很昂贵,只需使用成员变量作为结果的缓存。