2012-07-28 3 views
3

저는 파이썬을 배우고 있습니다. 파이썬이 어떻게 저를 혼란에 빠뜨리는 하위 클래스를 구성하는지 알게되었습니다.파이썬 상속과 __init__

다음과 같이 목록 클래스에서 상속하는 클래스가 있습니다.

class foo(list): 
    def __init__(self, a_bar): 
     list.__init__([]) 
     self.bar = a_bar 

나는 list.__init__([])가 있어야하지만 난 그것에 대해 혼란 스러워요 것을 알고있다. 이 라인은 새로운리스트 객체를 생성 한 다음 아무 것도 할당하지 않는 것으로 보입니다. 그래서 나는 그냥 가비지 수집을 할 것이라고 생각합니다. 파이썬은이 목록이 내 객체의 일부라는 것을 어떻게 알 수 있습니까? 나는 무언가 뒤에서 일어나는 일이 무엇인지 알기를 원합니다.

+3

이 코드를 어디에서 찾을 수 있습니까? 정확하지 않습니다. –

답변

0

실제 개체는 __init__으로 생성되지 않고 __new__으로 생성됩니다. __init__은 객체 자체를 생성하는 것이 아니라 초기화하는 것입니다. 즉, 속성을 추가하는 것입니다. __init__이 호출되면 __new__이 이미 호출되었으므로 예제에서 코드가 실행되기 전에 목록이 이미 생성되었습니다 . __init__은 "in-place"(변형 된) 개체를 초기화해야하기 때문에 아무 것도 반환하지 않아야하므로 부작용이 발생합니다. (a previous questionthe documentation을 참조하십시오.) __init__() 기능 서브 클래스와 오버라이드 (override) 할 때

2

당신은 일반적으로이 작업을 수행 :

super().__init__() 
: 파이썬 3를 사용하는 경우

list.__init__(self) 

, 당신은 super()의 사용을 만들 수 있습니다

3

다중 상속에 안전한 방법은 다음과 같습니다.

class foo(list): 
    def __init__(self, a_bar): 
     super(foo, self).__init__() 
     ... 

은 아마 여러분이 baseclass ctor라고 부르는 것을 분명히합니다.

+0

MI 안전을 위해서는 그 이상의 것이 필요합니다. – delnan

+0

@delnan과 같은 ..? – thebjorn

+3

상속 트리의 모든 클래스가'super'를 사용하여'__init__' 인수에 동의합니다. [파이썬의 슈퍼() 슈퍼를 고려하십시오!] (http : //rhettinger.wordpress.co.kr/2011/05/26/super-considered-super /)를 준수해야합니다. – delnan

1

당신은 부분적으로 맞다 :

list.__init__([]) 

은 "새 목록 개체를 만듭니다." 그러나이 코드는 잘못되었습니다. 올바른 코드 _should_be : 당신은 그것이 (아마도) 자체를 초기화하는 것이 중요하지 __init__() 방법은 자신의있는 list에서 상속하고 있기 때문에

list.__init__(self) 

당신이해야하는 이유가있다. 자신의 __init__() 메서드를 정의하면 상속 된 동일한 이름의 메서드를 효과적으로 재정의합니다. 부모 클래스의 __init__() 코드가 실행되도록하려면 해당 부모 클래스의 __init__()을 호출해야합니다. super() 슈퍼의 함정에 대한 지침 this article를 참조 this question를 참조 더에 대한

#explicitly calling the __init__() of a specific class 
#"list"--in this case 
list.__init__(self, *args, **kwargs)  

#a little more flexible. If you change the parent class, this doesn't need to change 
super(foo, self).__init__(*args, **kwargs) 

:

몇이 일의 방법이 있습니다.

+0

이것은 정답이어야합니다! –