[Python] Overloading 된 함수에서 부모클래스의 함수 호출 방법 Develop Tip


다음과 같은 아주 간단한 클래스가 있습니다.

class Parent(object):
def __init__(self, val):
self.val = val
def __eq__(self, other):
return self.val == other.val
if __name__=='__main__':
p1 = Parent(1)
p2 = Parent(1)
print p1 == p2 # This result is True

__eq__ 는 C++의 == 연산자 operator overloading 과 같은 개념입니다.

위의 간단한 결과는 True 입니다. 두 개의 클래스가 같은 self.val 값을 가지기 때문입니다.

이제는 다음과 같이,

class Parent(object):
def __init__(self, val):
self.val = val
def __eq__(self, other):
return self.val == other.val

class Child(Parent):
def __init__(self, val, name):
Parent.__init__(self, val)
self.name = name
def __eq__(self, other):
return self.name == other.name

if __name__=='__main__':
p1 = Parent(1)
p2 = Parent(1)
print p1 == p2 # This result is True

c1 = Child(1, 'a')
c2 = Child(1, 'b')
print c1 == c2 # This result is False

Child 를 Parent 에서 상속을 받고 == 비교를 해 봅니다.

결과는 False 입니다. 왜냐하면 생성자의 두번째 패러미터인 self.name 이 서로 다르기 때문이지요.

그런데 문제는 Child의 __eq__ 함수가 아니라 Parent의 __eq__ 를 호출하고 싶을 때 발생합니다.

뭐 찾다가 아래와 같이 호출하니 되네요...

c1.__class__ = Parent
c2.__class__ = Parent
print c1 == c2 # This result is True

하지만 클래스 자체가 Parent로 바뀌었기 때문에,
다시 Child 인스턴스로 사용하기 위해서는 원복 시켜야 할 것입니다.


어느 분께는 도움이 되셨기를...

덧글

  • 지나가다 2013/11/26 14:25 # 삭제 답글

    안녕하세요. 매번 좋은 경험 잘 배우고 있습니다.
    저도 따라서 실행 해보고는 다른 생각을 하게 돼서 댓글 올립니다.

    원래 상속의 경우 오버로드 된 연산자를 떠올리는 게 일반적이기 때문에 코드를 다시 보게 되는 경우
    해당 부분만 단편적으로 떠올린다면 주변 코드를 읽는 데 혼란이 있을지도 모른다는 생각이 들더라구요.

    super(Child, c1).__eq__(c2)

    저는 이렇게 명시적으로 호출해봤습니다.
  • 지훈현서아빠 2013/11/26 15:26 #

    아하! 그렇군요~ 저는
    super(Parent,n1) == super(Parent, n2)
    라고 하였을 때 결과가 안 나와서 이렇게 해 보았습니다~
    좋은 의견 감사드립니다~
댓글 입력 영역

구글애드텍스트