2012-02-23 127 views
2

OO并不是我最强壮的服装,所以请耐心等待。我想设计一个类的结构是这样的:如何在Python类中设置属性

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方法中设置属性,但将其设置为None,直到调用sequence_dna方法为止?似乎是kludgy,尤其是因为我有很多变量,所有这些都取决于DNA测序的结果,因此设置为None。

我觉得我缺少一块拼图...

回答

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我认为会很大..)

+0

这是什么'get_'业务? Python有真实的属性。 – 2012-02-23 08:41:38

+1

我不会称他们是真实的。它们只是方法的包装。你也可以创建一个属性类来设置一个属性 - 在指定某个属性与我无关后,必须定义'get'和'set'。 当OP对财产有疑问时,我会留意,但这个似乎是关于OO和继承。 – synthesizerpatel 2012-02-23 09:17:29

+0

非常好。所以我的直觉是正确的:我需要将所有内容都设置为“无”,然后根据请求设置它们的值。谢谢。 – mlissner 2012-02-24 04:37:29

1

没有理由为什么你不能变量初始化到None

可能缺少的一个难题就是该变量不应该是您的类的用户获得基因序列值的主要接口。让他们调用序列方法,如果序列方法很昂贵,只需使用成员变量作为结果的缓存即可。

相关问题