2014-01-17 4 views
2

"list"클래스의 기능을 확장하고 이벤트에 대한 사용자 정의 핸들러를 추가하려고합니다 : "목록에 새 항목 추가"및 "목록에서 항목 제거". 이 작업을 위해 나는 컴포지션을 사용하고 싶지 않습니다. 상속이 더 좋습니다. 내가 뭘하려Python : 올바른 방법으로 목록을 확장하십시오

는 수행

class ExtendedList(list): 

    def append(self, obj): 
     super(ExtendedList, self).append(obj) 
     print('Added new item') 

    def extend(self, collection): 
     if (hasattr(collection, '__iter__') or hasattr(collection, '__getitem__')) and len(collection)>0: 
      for item in collection: 
       self.append(item) 

    def insert(self, index, obj): 
     super(ExtendedList, self).insert(index, obj) 
     print('Added new item') 

    def remove(self, value): 
     super(ExtendedList, self).remove(value) 
     print('Item removed') 

하지만 제대로 작동하지 않습니다. 나는 모든 사건들을 추가하고 제거 할 수 없다. 예 :

collection = ExtendedList() 
collection.append('First item') 
# Out: "Added new item\n"; collection now is: ['First item'] 
collection.extend(['Second item', 'Third item']) 
# Out: "Added new item\nAdded new item\n"; collection now is: ['First item', 'Second item', 'Third item'] 
collection += ['Four item'] 
# Don't out anythink; collection now is: ['First item', 'Second item', 'Third item', 'Four item'] 
collection.remove('First item') 
# Out: "Item removed\n"; collection now is: ['Second item', 'Third item', 'Four item'] 
del collection[0:2] 
# Don't out anythink; collection now is: ['Four item'] 
collection *= 3 
# Don't out anythink; collection now is: ['Four item', 'Four item', 'Four item'] 

내 상황에 맞는 클래스 "목록"을 확장하는 올바른 방법은 무엇입니까? 도와 주셔서 감사합니다.

+1

목록의 하위 클래스를 정의하는 것은 좋지 않습니다. 대신 상속에 대한 집계를 선호해야합니다. – gefei

+0

각각 다른 작업을 수행하기 때문에 수행하려는 작업에 더 적합한 것을 사용하십시오. – brandonscript

+1

당신은 무슨 일이 일어 났는지 보여 주었지만 그게 잘못된 것입니까? 무슨 일이 일어나길 원하니? – nmichaels

답변

5

list에서 상속하는 대신 추상 추상 클래스 인 collections.MutableSequence을 상속합니다. 이것은 모든 기본 작업을 수행하여 변경하려는 것에 집중할 수 있도록합니다. ABCs here에 대한 좋은 질문이 있습니다. 같은 *=, +=del

1

UserList 클래스를 살펴보십시오. http://pydoc.org/2.2.3/UserList.html 변경해야하는 모든 방법이 표시됩니다. 문제는 type(ExtendedList([]) * 2) == list입니다.

+1

이것은 정말로 쓸모없는 답변입니다. 파이썬 2.2+는'list'를 확장하는 데 아무런 문제가 없으며,''문제 ''는 2.3 이후의 해결책이 있었고 2.6+는''MutableSequence' (http://docs.python.org/2/library/collections.html # collections-abstract-base-classes) ABC, 누구에게도 'UserList'를 다시 보지 못하게하는 마지막 이유를 제거했습니다. 그래서 더 이상 사용되지 않으며 전적으로 문서에서 제거되었습니다. – abarnert

+0

오른쪽. 그것은 이제 쓸모가 없습니다. MutableSequence를 기억할 수 없습니다. – User

+0

죄송합니다. 2.6에서는 삭제되지 않았습니다. 2.6과 그 외 [관련 모듈] (http://docs.python.org/2.6/library/userdict.html?highlight=userlist#module-UserList)를 하나의 페이지로 묶어서 " 참고 :이 모듈은 이전 버전과의 호환성을 위해서만 제공됩니다. " 여전히 좋은 제안은 아닙니다. 특히 파이썬 3.x를 사용하는 것처럼 보이는 OP를 위해. – abarnert

3

운영 등, __add__, __delitem__, __delslice__처럼 list 클래스의 연산자 함수를 사용하여 구현하는 그들의 많이 있습니다. "확장 된"목록 클래스에 대한 모든 가능한 호출을 가로 채길 원한다면, 모든 연산자가 아니라면 대부분을 오버라이드해야합니다. 당신이 내장 클래스를 구현하는 방법을 제어 할 수 없기 때문에

, 그것은 에 내장에서 상속에보다 내장 주위에 새로운 클래스을 구성 일반적으로 쉽다.

+0

내가 잘못했기 때문에 집계를 사용하거나 MutableSequence에서 상속하는 것이 좋습니다 ... – uzumaxy

2

+와 같은 연산자를 재정의하려면 명시 적으로 수행해야합니다. The documentation을 사용하면 변경해야 할 사항을 파악하는 데 도움이됩니다.

관련 문제