인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

lightstone87님의 프로필 이미지
lightstone87

작성한 질문수

[Level 1] Qt를 이용한 Python 프로그래밍: 입문편

QFile과 QDataStream을 이용한 예제 구현 Part 2

클래스 __init__(self) 설정에서 이해가 안 되는 부분이 있습니다.

작성

·

21

1

안녕하세요. 궁금한 게 있으면 언제든지 질문하라고 하셔서... 용감(?)하게 질문해 봅니다.

매번 강의 너무 잘 듣고 있습니다^^

 

강의를 따라 듣다 보니까,

Pyside6에서 필요한 모듈은 모두 import한 다음,

클래스를 만들며넛 ui 제작이 시작되더라고요.

 

그런데, 처음 클래스를 만들고 초기화 할 때, init()메서드 부분이 잘 이해가 되지 않습니다. 어느 경우에는 parent를 매개변수로 설정하고, 어느 경우에는 super()를 안 쓰고 그러는데, 그냥 따라서 코드만 작성하기에는 뭔까 찝찝한 느낌이라 확실히 알고 코드를 작성하고 싶습니다.

검색을 해도...? "클래스를 만들 때는 그냥 쓰는 거다"라는 의미로 훅 넘어가는데... 이 구문들의 의미와 필요성?이 잘 와닿지가 않아 여쭙니다.

아래 첨부한 코드는 section13에 3번째 강의 내용 중 발췌한 내용입니다.

class PriceApp(QWidget):
    def __init__(self):
        super(PriceApp, self).__init__()
        self.ui = Ui_Widget()
        self.ui.setupUi(self)
        self.setWindowTitle("QDataSteam Example")

답변 2

1

lightstone87님의 프로필 이미지
lightstone87
질문자

감사합니다. 덕분에 이해가 안 되었던 부분들이 잘 정리되었습니다. 좋은 주말 보내세요 강사님^^

1

김대진님의 프로필 이미지
김대진
지식공유자

질문 주신 내용은 Python 클래스와 상속, 그리고 super()와 init 메서드의 사용에 대한 중요한 개념과 관련이 있습니다. PySide6 같은 프레임워크에서 super()와 부모 클래스 호출의 의미를 이해하는 것이 중요한 이유는 코드의 확장성과 유지보수성에 큰 영향을 주기 때문입니다. 이를 하나씩 정리해 드리겠습니다.


1. __init__ 메서드의 역할

__init__ 메서드는 클래스의 생성자(constructor)로, 객체가 생성될 때 자동으로 호출됩니다. 주요 역할은 다음과 같습니다:

클래스의 초기화 작업 수행

인스턴스 변수 정의 및 초기값 설정

예:

class MyClass:
    def __init__(self, value):
        self.value = value

obj = MyClass(10)  # 객체 생성 시 __init__이 호출됨
print(obj.value)   # 출력: 10

 


 

2. super()와 부모 클래스 호출

super()는 부모 클래스의 메서드를 호출하는 데 사용됩니다. 특히 다중 상속 환경에서도 올바른 부모 클래스의 메서드를 호출할 수 있도록 돕는 역할을 합니다.

사용 이유:

  1. 부모 클래스의 초기화 작업 상속: PySide6에서 QWidget이나 다른 위젯 클래스는 많은 내부 초기화 작업을 수행합니다. 따라서 이를 제대로 초기화하지 않으면 프로그램이 정상적으로 동작하지 않을 수 있습니다.

  2. 중복 코드 방지: 부모 클래스에서 정의된 메서드를 그대로 활용하여 코드 중복을 줄입니다.

예시:

부모 클래스의 __init__ 호출:

class Parent:
    def __init__(self):
        print("Parent 초기화")

class Child(Parent):
    def __init__(self):
        super().__init__()  # 부모 클래스의 __init__ 호출
        print("Child 초기화")

child = Child()
# 출력:
# Parent 초기화
# Child 초기화

 



3. parent를 매개변수로 사용하는 경우

PySide6에서는 위젯 계층 구조가 중요한 역할을 합니다. 예를 들어, 한 위젯이 다른 위젯의 자식 위젯으로 포함되면, PyQt/PySide에서 parent 매개변수를 통해 이를 지정합니다.

parent의 역할:

  • 자식 위젯이 부모 위젯의 크기나 위치에 종속되도록 설정

  • 위젯이 삭제될 때 부모-자식 관계에 따라 자동으로 정리

예:

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)  # 부모 위젯 전달
        self.setWindowTitle("Parent-Child Example")

parent_widget = QWidget()
child_widget = MyWidget(parent=parent_widget)  # parent_widget이 부모

4. 첨부하신 코드 분석

class PriceApp(QWidget):
    def __init__(self):
        super(PriceApp, self).__init__()  # 부모 클래스(QWidget)의 __init__ 호출
        self.ui = Ui_Widget()             # Ui_Widget 객체 생성
        self.ui.setupUi(self)             # UI 초기화
        self.setWindowTitle("QDataSteam Example")  # 윈도우 제목 설정

 

핵심 설명:

  1. super(PriceApp, self).__init__():

  • 부모 클래스(QWidget)의 초기화 작업을 호출합니다.

  • 여기서 PriceApp 클래스가 QWidget을 상속받았기 때문에, QWidget의 모든 기능을 사용하려면 이를 호출해야 합니다.

  1. self.ui = Ui_Widget() 및 self.ui.setupUi(self):

  • Ui_Widget은 아마도 Qt Designer로 생성된 UI 클래스일 것입니다.

  • setupUi(self)를 호출하여, UI 요소들을 self 객체(즉, PriceApp 인스턴스)에 적용합니다.

  1. self.setWindowTitle("QDataSteam Example"):

  • 윈도우의 제목을 설정합니다. 이 메서드는 QWidget의 메서드입니다.


5. super()를 안 쓰는 경우?

PySide6에서 super()를 사용하지 않으면, 부모 클래스의 초기화 코드가 호출되지 않아 프로그램이 제대로 동작하지 않을 가능성이 높습니다. 예를 들어:

잘못된 코드:

python

class PriceApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)  # super() 대신 직접 호출

이 방식은 동작은 할 수 있지만:

  • 다중 상속에서 오류를 유발할 수 있습니다.

  • 코드의 가독성과 유지보수성이 떨어집니다.

권장 방식:

항상 super()를 사용하여 부모 클래스의 메서드를 호출하세요.

 



6. 정리

  • init: 객체 초기화 메서드로, 인스턴스 변수를 설정하거나 초기화를 수행합니다.

  • super(): 부모 클래스의 메서드나 초기화를 호출하기 위해 사용됩니다.

  • parent: 위젯 간의 부모-자식 관계를 설정할 때 사용됩니다.

  • PySide6에서 super()를 사용해 부모 클래스의 초기화 메서드를 호출하는 것은 필수적입니다.

혹시 다른 부분이나 예제가 필요하시면 언제든 말씀해주세요! 😊

 

감사합니다. 김대진 드림.

lightstone87님의 프로필 이미지
lightstone87

작성한 질문수

질문하기