Python의 상속 및 init 메서드


94

저는 파이썬을 좋아합니다. 상속 및 __init__().

class Num:
    def __init__(self,num):
        self.n1 = num

class Num2(Num):
    def show(self):
        print self.n1

mynumber = Num2(8)
mynumber.show()

결과: 8

괜찮습니다. 하지만 교체 Num2와 함께

class Num2(Num):
    def __init__(self,num):
        self.n2 = num*2
    def show(self):
        print self.n1,self.n2

결과: Error. Num2 has no attribute "n1".

이 경우 어떻게 Num2액세스 할 수 n1있습니까?

답변:


148

첫 번째 상황에서, Num2클래스를 확장하고 Num하고 있기 때문에 특별한 방법은 이름을 재정의되지 않은 __init__()에서 Num2그것은로부터 상속됩니다, Num.

클래스가 __init__() 메서드를 정의 __init__()하면 새로 생성 된 클래스 인스턴스에 대해 클래스 인스턴스화가 자동으로 호출됩니다 .

두 번째 상황에서는 재정의하기 때문에 __init__()Num2명시 적으로 슈퍼 클래스 (의 하나를 호출 할 필요가 Num) 당신이 그 동작을 확장하려는 경우.

class Num2(Num):
    def __init__(self,num):
        Num.__init__(self,num)
        self.n2 = num*2

23
귀하의 인용은 __init__파생 클래스에서 메서드를 정의하지 않을 때 상속 되는 이유를 설명하기에 충분하지 않습니다 . 때문이다 "요청 된 속성이 클래스에서 발견되지 않는 경우, 검색이 기본 클래스에서 볼로 진행한다." (doc)
eyquem

5
죄송합니다 ... 그게 기본적으로 상속이 작동하는 방식입니다 ... 클래스를 상속하면 전체 패키지를 얻게되므로 수퍼 클래스의 모든 것이 하위 클래스에 존재합니다. 그러나 메서드를 재정의하면 재정의됩니다. 그게 코드에있는 일입니다.
coya

4
@ mario-duarte 왜 이것이 더 나을 것 super(Num2, self).__init__(num)입니까?
guival

1
이 답변에서 제안한 솔루션에서를 사용하여 전환했으며 super이제 프로그램이 몇 초 더 빨리로드됩니다. 이유를 모르겠습니다.
Guimoute

super다중 상속을 사용할 때 유용합니다. 단일 상속의 경우 이점이 분명하지 않습니다.
Johann Bzh


4

을 호출하지 않기 때문에 Num.__init__"n1"필드는 생성되지 않습니다. 그것을 부르면 거기에있을 것입니다.


3

다음과 같은 Num2 클래스의 간단한 변경 :

super().__init__(num) 

python3에서 작동합니다.

class Num:
        def __init__(self,num):
                self.n1 = num

class Num2(Num):
        def __init__(self,num):
                super().__init__(num)
                self.n2 = num*2
        def show(self):
                print (self.n1,self.n2)

mynumber = Num2(8)
mynumber.show()

1
이것이 내가 stackoverflow를 좋아하는 이유입니다. 이 질문에 대한 답은 아니지만 도움이됩니다. 때때로 사람들이 게시하는 답변은 사람들이 물어보아야 할 질문에 대한 답변입니다. 감사합니다!
Glen Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.