2009-09-07 15 views
1

我希望這個課程能像列表一樣行事。它的數據駐留在屬性self.data中。 如果我有一個實例,pp = population,是否定義爲__getitem__意味着我可以參考 pp而不是pp.data?或者它是否定義了__repr__這樣做? 從列表而不是對象派生出這個類爲我提供'流行'。 現在我需要實現'pop'方法。謝謝Python:如何在這個類中實現'pop'?

class population (object): 
def __init__ (self): 
    self.data = [] 

def append(self, item): 
    self.data.append(item) 

def extend(self, item): 
    self.data.extend(item) 

def sort(self): 
    self.data.sort(cmp=fitnesscompare) 

def __getitem__(self, index): return self.data[index] 

def __setitem__(self, index, item): self.data[index] = item 

def __len__(self): return len(self.data) 

def __repr__(self): return repr(self.data) 

def copy(self): 
    return copy.deepcopy(self) 

回答

7

爲什麼不只是擴展列表類?然後,你把所有的內置該功能。

class population(list): 
    # custom methods here 

只要記住,而不是引用self.data的名單,只是參考self

+0

是的,這表現很好。我不得不添加'複製'方法,謝謝 – 2009-09-07 22:40:39

2
def pop(self, index=-1) : 
    return self.data.pop(index) 

這將實現預期的行爲:

  • 回報,如果沒有索引傳遞的最後一個項目;
  • 如果通過,則返回「index」處的項目;
  • 將使用底層pop()的類型檢查;
  • 將引發與底層pop()相同的異常。

我會有Evan Fosmark之前建議的分類列表,但我可以看到不這樣做的很好理由。成分可以減輕低耦合,並且您可以完全控制它。但是你必須爲所有你想委託的方法寫橋樑,這可能是一種痛苦......

+0

我會試試這個。我分類人口(名單)。它的一個實例有一些本身不可迭代的「染色體」類實例的集合。但是當我嘗試'instOfPopulation.pop()'我得到「TypeError:'染色體'對象是不可迭代的」 – 2009-09-07 23:54:49

+0

我真的不知道出了什麼問題,子類或我的解決方案?而且電影方面,沒有fosmark解決方案的工作?在這種情況下,它應該被接受。 – 2009-09-08 10:51:01

+0

我仍然無法在人口階層上使用'pop()'。當我嘗試使用你的方法時,出現以下錯誤消息:「文件」C:\ Python26 \ Code \ OO.py「,第201行,在彈出返回self.pop(索引)」並滾動直到「最大遞歸深度突破」。我難以理解爲什麼列表不會彈出()它的內容並返回一個錯誤,說明內容本身不可迭代。我是新來的stackoverflow,並沒有意識到我應該接受一個答案。我可以按照fosmark的建議列出子列表,但我仍然無法在人口中實現'pop()' – 2009-09-08 13:39:00

1

If I have an instance, pp = population, does defining __getitem__ mean I can refer to pp instead of pp.data?

本質上是的。添加一個__getitem__方法等效於在其他語言中重載[]運算符。因此,下面兩個是等價的:

pp.data[0] 
pp[0] 

Or is it the defining of __repr__ that does that?

定義__repr__會給你對象的字符串表示。因此,這兩個調用是等價的:

repr(pp.data) 
repr(pp) 

Would deriving this class from list instead of object provide me with 'pop'.

從我現在看到,從名單繼承可能是要走的路。除非我錯過了一些東西,唯一不同的是排序方法和複製。其他一切都是一樣的。

+0

謝謝,這清理了很多 – 2009-09-07 23:48:27

1

這真的是列表的東西,還是你用列表來存儲一堆東西?在從列表繼承之前,爲什麼不使用列表?

我嘗試爲真實的東西保存繼承關係。一個窗體是一個窗口,一個對話框是一個窗體等等。如果你只是建模is-implemented-using-a,那麼只需使用基類,或者使用包含和委派。

這是什麼關於人口不僅僅是一個列表?