2012-02-23 98 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

可能缺少的一個難題就是該變量不應該是您的類的用戶獲得基因序列值的主要接口。讓他們調用序列方法,如果序列方法很昂貴,只需使用成員變量作爲結果的緩存即可。