2012-05-02 1 views
16

어디서나이 설명에 대한 명확한 설명을 찾을 수 없다는 것을 당황스럽게합니다. 하위 클래스의 same-name 메서드 내에서 기본 클래스의 메서드를 호출해야하는 이유는 무엇입니까?Python 상속 - 하위 클래스 내부에서 기본 클래스 메서드를 호출합니까?

class Child(Base): 
    def __init__(self): 
     Base.__init__(self) 

    def somefunc(self): 
     Base.somefunc(self) 

기본 클래스의 메소드를 완전히 덮어 쓰지 않으려는 경우이 작업을 수행한다고 생각합니다. 그게 정말로 전부입니까?

답변

2

완전히 클래스와 방법에 따라 다릅니다.

기본 메소드 실행 전후에 다른 메소드를 호출하거나 다른 인수로 호출하려는 경우 서브 클래스 메소드에서 기본 메소드를 호출해야합니다.

전체 메서드를 바꾸려면 분명히 호출하지 않아야합니다.

+0

그러나 부모 클래스는 항상 '__init__'을 호출해야합니다. – Amber

13

일반적으로 기본 클래스 메서드를 수정하지 않고 기능을 확장하여 기능을 확장하려는 경우에이 작업을 수행합니다. 이 작업을 수행 할 수있는 적절한 방법이 use super instead of directly calling the base class 인 것이

class DefaultDict(dict): 
    def __init__(self, default): 
     self.default = default 
     dict.__init__(self) 

    def __getitem__(self, key): 
     try: 
      return dict.__getitem__(self, key) 
     except KeyError: 
      result = self[key] = self.default() 
      return result 

참고 : defaultdict이의 좋은 예입니다. 이와 같이 :

class BlahBlah(someObject, someOtherObject): 
    def __init__(self, *args, **kwargs): 
     #do custom stuff 
     super(BlahBlah, self).__init__(*args, **kwargs) # now call the parent class(es) 
+0

"수퍼"기능에 대해 정말 큰 점은 무엇입니까? – user1369281

+5

@ user1369281 : 음, 항상 좋은 것은 아닙니다. 그러나 일관되게 사용하면 상속 트리를 훨씬 쉽게 작업 할 수 있습니다. 예를 들어,'defaultdict'를 기본 _ordered_dict로 바꾸고 싶다면 어떻게해야할까요? 'super()'를 사용했다면, 코드에서 변경해야하는 _only_ 클래스 정의가 될 것입니다. 이 모든'super'는 자동으로 현재 클래스가 상속하는 기본 클래스를 참조합니다. 블랙 박스 프로그래밍을 용이하게합니다. –

+0

클래스가 여러 클래스를 상속받을 수 있다고 상기 시키거나 가르쳐주기 때문에 나는 이것을 좋아합니다. 부모 클래스가 lib의 객체이고, 객체를 이미 상속받지 못했다면 클래스에'object'를 추가하면됩니다. – casey