2016-12-28 7 views
0

이것은 책 머리 첫 번째 파이썬 (208 페이지 6 장)에서 발췌 한 것입니다. 난 내 자신의 버전을 쓰기에 왔을 때 나는 내가 extend 단계를 건너 뛸 수 있다고 생각초기화 목록 수퍼 클래스 - 때로는 자체 매개 변수가 필요하지만 다른 매개 변수는 필요하지 않습니까?

class AthleteList(list): 
    def __init__(self, a_times=[]): 
     list.__init__([]) 
     self.extend(a_times) 

:

class AthleteList(list): 
    def __init__(self, a_times=[]): 
     list.__init__(a_times) 

를 처음에 나는 그래서 서브 클래스의 초기화의 책에서 예를 보았다 목록을 인쇄에 관해서 :

test = AthleteList([1,2,3]) 
print(test) 

출력은 [], 그래서 초기화에 문제가 있습니다. When searching around는, 내가 찾은 모든 경우에 나는 그것이 필요 명시 적으로 self을 전달하여 슈퍼 클래스를 초기화 보았다 :

더 의미
class AthleteList(list): 
    def __init__(self, a_times=[]): 
     list.__init__(self, a_times) 

: 목록의 상위 클래스 자체가이 목록을 초기화 할 수 있도록 인수로 전달 된 객체를 필요 값. 왜 첫 번째 예제 (실제로 작동합니까?)에 self이 필요하지 않은 것을 제외하고 는요? 비록 내가 빈리스트를 가지고 그것을 초기화한다고하더라도, 여전히 self의리스트가 비게되도록 self 객체를 반드시 전달해야합니다. 나는 심지어는 기본적으로 그것을 할 것 같다, 먼저 빈리스트로 초기화 할 필요가 없습니다, 난 그냥 나중에 확장 할 수

class AthleteList(list): 
    def __init__(self, a_times=[]): 
     self.extend(a_times) 
+0

책에서'def __init __ (self, a_times = [])'를 보았습니까? 그렇다면 책을 바꾸는 것을 고려해야합니다. http://stackoverflow.com/documentation/python/3553/common-pitfalls/12258/mutable-default-argument#t=201612281429272429582 – DeepSpace

+1

필자가 보았 듯이 'AthleteList'는'list' 타입이므로'[]' 부모 객체를 초기화하기 위해'self' 대신에 사용됩니다 (어떤 생성자도 인자를 필요로하지 않습니다). 그러나 내 눈에는 이것이 매우 부정합니다. 첫 번째 코드 스 니펫에서'list .__ init __ ([1, 2, 3])'를 시도하고 emtpy'a_times'를 사용하여 객체를 생성하십시오. 값은 표시되지 않습니다. – ppasler

+0

은 ['UserList'] (https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.UserList)를 사용하면 더 쉽게 목록에서 상속받을 수 있습니다. 여기 모든 것이 expcected로 작동합니다. –

답변

1

이 아마 list를 서브 클래 싱하는 가장 안전한 방법입니다; 기본 클래스로 UserList 사용하고 상황이 예상대로 작동 : 일반적으로 인정 하듯이 모든 질문에 대답하지 않고 출발점이 될 수있다

from collections import UserList 

class AthleteList(UserList): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

athlete_list = AthleteList((1, 2, 3)) 
print(athlete_list) # -> [1, 2, 3] 

.

여기에 대한 자세한 대답은 https://stackoverflow.com/a/25464724/4954037입니다.