2013-12-16 1 views
1

나는 상속과 슈퍼로 혼란 스럽다. 여기에 내가 몇 가지 코드를 작성하고, 여기에 python에서 super 키워드로 상속을 혼동하고 있습니까?

class Animal(object): 
    """docstring for Animal""" 
    __name, __weight, __sound = ["",0,1] 
    def __init__(self): 
     super(Animal, self).__init__() 

    def setName(self, newName): 
     self.__name = newName 
    def getName(self): 
     return self.__name 

class Dog(Animal): 
    """docstring for Dog""" 
    def __init__(self): 
     super(Dog, self).__init__() 
    def setName(self, name): 
     self.name = "here is "+ name 
    def getName(self): 
     return self.name 


if __name__ == "__main__": 
    fida = Dog() 
    fida.setName('fida') 


    def changeObjectName(obj): 
     obj.setName("Marcus") 

    print fida.getName() 
    changeObjectName(fida) 
    print fida.getName() 

내가 두 경우 출력을 관찰하고, 아래를 참조하십시오

일이 같은 개 클래스의 코드를 주석

class Dog(Animal): 
    """docstring for Dog""" 
    def __init__(self): 
     super(Dog, self).__init__() 
    # def setName(self, name): 
    # self.name = "here is "+ name 
    # def getName(self): 
    # return self.name 

fida 
Marcus 

내가 OBS가 위의 출력에서 ​​: 그리고이 같은 결과를 얻었다 수퍼 클래스에서 호출 된 메소드를 삭제했습니다. 위의 출력에서 ​​동물) 코멘트없이

이 같은 개 클래스의 코드,

class Dog(Animal): 
    """docstring for Dog""" 
    def __init__(self): 
     super(Dog, self).__init__() 
    def setName(self, name): 
     self.name = "here is "+ name 
    def getName(self): 
     return self.name 

그리고이 같은 결과를 얻었다

here is fida 
here is Marcus 

나는 방법을 관찰 하위 클래스 (즉, Dog)에서 호출 됨

setName은 super에서 호출하지 않습니다. 개 클래스의 코드에 주석이없는 클래스?

위의 코드를 설명해주십시오? 예를 들어 # 1

+6

이 놀라운 부분은 무엇입니까? 다르게 일어날 것으로 예상되는 것을 나타내지는 않았습니다. – user2357112

+0

죄송합니다. @ user2357112. 내 코드를 편집했습니다. – codeimplementer

+0

무엇? 왜 당신이 super()를 호출하지 않으면, 파이썬은 super()를 호출하지 않는지 묻고 있습니까? –

답변

0

, 당신은 getNamesetName의 구현은 기본 (Animal)를 오버라이드 (override) 하지 있습니다.

  • 그래서 당신 set 이름 첫 번째 "FIDA을"로, 다음 get 제 (self.__name에 저장) 이름과 print 이름.
  • 은 다음 예 # 2에서 "마커스"

와 동일한 작업을 수행, 당신은 Dog 클래스의 사람과 getNamesetName의 기본 구현을 재정의.

  • 호출 setName() 지금 (당신이 "here is"+name-self.name를 설정하는) "여기 FIDA입니다"로 이름을 설정합니다 (self.name에 저장) 다음 get 이름과 print 그것. 클래스 '멤버 함수 그냥 할 것를 오버라이드 (override) "마커스"

  • 반복 : 함수를 재정을 (대체) 모든 부모 클래스를 마술처럼 호출하지는 않습니다.

  • 1

    당신이 실제 객체가 아닌 구성원 개체를 사용 예 1, 파이썬은 상속 사다리를 올라가 일치하는 멤버를 찾습니다. 그리고 발견 된 경우 수행 된 작업에 따라 반환하거나 실행합니다. 부모 중 한 곳에서도 발견되지 않으면 오류가 발생하여 실패합니다. 당신이 부모와 자식 모두에서 같은 이름의 방법이있을 때 당신은 자식 객체 메소드를 호출하는 경우 일치하는 항목이있는 경우

    예 2

    , 자식 객체가 먼저 검색 될 것입니다 수행 된 작업에 따라 반환/실행됩니다. 기본적으로 자식 객체의 메서드는 부모 객체의 메서드를 음영 처리합니다.

    0

    super()에 대해 혼란스러워하고 있다고 생각합니다.

    super()super()에 대한 호출을 생략하면 기본 클래스의 상속 된 메서드가 자동으로 호출되지 않습니다. 명시 적으로 사용해야합니다. Tis는 파이썬 방식 인입니다.