[英]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)
這將實現預期的行為:
我可以像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.