inflearn logo
강의

講義

知識共有

[Level 1] Qtを使ったPythonプログラミング:入門編

QFileとQDataStreamを利用した実装例 Part 2

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

300

lightstone87

投稿した質問数 3

2

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

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

 

강의를 따라 듣다 보니까,

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")

python gui qt qml pyside6

回答 2

1

lightstone87

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

1

qtdev

질문 주신 내용은 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()를 사용해 부모 클래스의 초기화 메서드를 호출하는 것은 필수적입니다.

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

 

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

6-6

0

5

0

작업형 1 유형 부분

0

10

1

수강평 이벤트

0

17

2

작업형 1 (삭제예정, 구 버전)

0

30

2

강의노트는 어디있나요?

0

17

1

노션 학습 자료 권한 요청

0

17

1

수강기간 연장 문의드립니다.

0

21

1

2유형 레이블 인코딩 VS 원핫 인코딩

0

24

3

part2강의 문의사항입니다.

0

19

2

수강기간 연장 문의드립니다.

0

26

1

인덱스 슬라이싱

0

27

2

코드를 첨부해야하는 이유가 있나요?

0

20

2

QT와 QT Designer에 대한 질문 사항

1

167

2

mutex, incNumber는 global 안붙여도 되는건가요?

1

115

2

Qt Resource를 사용하는 예제 구현 10:15 구간 질의

1

140

2

데코레이터 @Slot을 꼭 써줘야 하는 건가요?

1

150

2

TableModel(QAbstractTableModel) 에서 질문입니다.

1

242

2

self가 있는 거와 없는 버튼

1

119

2

선호하는 GUI 개발 방법이 있으신가요

1

304

2

가장 큰 위젯의 너비와 같은 너비를 차지하는 2열 짜리 컬럼

1

228

2

exe 배포 시 .ui 파일 처리하는 권장하는 방법이 있나요?

1

306

1

pyqt? pysie6? 차이점이 있을까요?

1

1316

2

자주 사용하는 Layout 살펴보기

1

151

2

강의 pdf파일 올려 주시면 안될까요?

2

236

2