프로그래밍/Python

[Python] 클래스 인스턴스 형변환 시, 주의할 점

채윤아빠 2023. 7. 9. 21:31
728x90
반응형

파이썬에서 형변환은 꼭 필요하지 않습니다. 오히려 리터럴 형식의 변수에 대한 형변환을 제외하고는 굳이 형변환을 권장하지도 않는 것 같습니다.(지금 생각해 보니, 클래스 인스턴스의 형변환 자체가 필요없기도 하거니, 그런 문법이 없군요. ^^;) 특히나 클래스 인스턴스에 대한 형변환은 무의미할 정도입니다.

 

다음과 같은 코드를 보면, 어디서 문제가 있는지 감이 오신다면 다행이지만 저와 같이 델파이(파스칼)에 더 익숙한 개발자라면 도대체 문제가 뭔지 알 수가 없을 수 있습니다. (저도 왜 이게 문제가 되는 잘 몰랐습니다. ^^;)

    def handleGroupboxAllClick(self) -> None:
        """ 그룹박스 내 모든 체크박스의 선택을 토글하는 "All" 버튼 핸들러 : 모든 체크박스 항목의 선택을 토글합니다. """
        tbtnClicked = self.sender()
        if (type(tbtnClicked) is QToolButton):
            parent = QToolButton(tbtnClicked).parent()
            # if (isinstance(parent, QGroupBox)):
            if (type(parent) is QGroupBox):
                self.toggleGroupCheckBox(tbtnClicked.parent())

그룹박스 내에 위치한 툴버튼을 선택하면, 그룹박스 내의 모든 체크박스를 선택하거나 해제하는 토글을 구현한 메소드입니다.

 

문제는 툴버튼의 부모 객체가 QGroupBox의 인스턴스임을 확인하는 과정에서 분명히 QGroupBox의 인스턴스가 맞음에도 if 문에서 False로 판단하여 원하는 토글 동작이 이루어 지지 않았습니다.

 

여러 디버깅을 돌려 보아도 안되던 것이 다음과 같이 형변환을 빼니 정상적으로 동작하였습니다.

    def handleGroupboxAllClick(self) -> None:
        """ 그룹박스 내 모든 체크박스의 선택을 토글하는 "All" 버튼 핸들러 : 모든 체크박스 항목의 선택을 토글합니다. """
        tbtnClicked = self.sender()
        if (type(tbtnClicked) is QToolButton):
            parent = tbtnClicked.parent()
            # if (isinstance(parent, QGroupBox)):
            if (type(parent) is QGroupBox):
                self.toggleGroupCheckBox(tbtnClicked.parent())

도대체 차이가 뭘까? 고민하면서 코드를 계속 보다보니, "QToolButton(tbtnClicked)" 구문을 쓴 의도는 tbtnClicked 인스턴스의 형을 QToolButton 클래스형으로 형을 변환하려는 의도였으나, 실제로는 QToolButton 인스턴스가 하나 생성된 것이었습니다. 그 결과로 당연히 새로 생서된 인스턴스가 QToolButton의 객체이므로 if 문에서 무조건 False가 반환되었던 것이었습니다.

 

결과적으로 파이썬에서 형변환은 리터럴(literal)형들 즉, int, bool, float, str 과 같은 데이터형들간의 형변환은 해줄 필요가 있겠으나, 그외 클래스들에서 생성된 인스턴스들에 대해서 굳이 형변환은 의미가 없고, 덕타이핑과 같이 자유롭게 사용할 수 있다는 장점을 최대한 활용해야겠습니다.