簡體   English   中英

Python:如何在此類中實現“ pop”?

[英]Python: how do I implement 'pop' in this class?

我希望這堂課像一個清單一樣。 它的數據駐留在屬性self.data中。 如果我有一個實例pp =人口,那么定義__getitem__意味着我可以引用pp而不是pp.data? 還是執行__repr__的定義? 從列表而不是對象派生此類將為我提供“流行音樂”。 現在,我需要實現“流行”方法。 謝謝

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)

為什么不只是擴展列表類? 然后,您將內置所有這些功能。

class population(list):
    # custom methods here

請記住,不要引用self.data作為列表,而只需引用self

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

這將實現預期的行為:

  • 如果沒有傳遞索引,則返回最后一項;
  • 如果通過,則返回“ index”處的項目;
  • 將使用基礎pop()的類型檢查;
  • 將引發與基礎pop()相同的異常。

我可以像Evan Fosmark之前建議的那樣將List細分為子類,但是我可以看到不這樣做的充分理由。 合成可以緩解低耦合,您可以完全控制它。 但是您必須為要委派的所有方法編寫橋,這可能會很麻煩...

如果我有一個實例pp =人口,那么定義__getitem__意味着我可以引用pp而不是pp.data?

從本質上講,是的。 添加__getitem__方法等效於重載某些其他語言中的[]運算符。 因此,以下兩個等效:

pp.data[0]
pp[0]

還是執行__repr__的定義?

定義__repr__將為您提供對象的字符串表示形式。 因此,這兩個調用將是等效的:

repr(pp.data)
repr(pp)

從列表而不是對象派生此類將為我提供“流行音樂”。

從我現在所看到的,從列表繼承可能是要走的路。 除非我缺少任何內容,否則唯一的不同就是排序方法和復制。 幾乎所有其他內容都是相同的。

這是真正的事情的清單 ,或者你使用列表存儲了一堆東西? 從列表繼承之前,為什么不只使用列表呢?

我盡力為真正的is-a關系保存繼承。 一個Form是一個窗口,一個Dialog是一個Form,等等。如果您只是使用a來實現建模,那么只需使用基類,或者使用包含和委派。

不僅僅是列表的人口有什么意義?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM