클래스 __init__(self) 설정에서 이해가 안 되는 부분이 있습니다.
300
投稿した質問数 3
안녕하세요. 궁금한 게 있으면 언제든지 질문하라고 하셔서... 용감(?)하게 질문해 봅니다.
매번 강의 너무 잘 듣고 있습니다^^
강의를 따라 듣다 보니까,
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
질문 주신 내용은 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()는 부모 클래스의 메서드를 호출하는 데 사용됩니다. 특히 다중 상속 환경에서도 올바른 부모 클래스의 메서드를 호출할 수 있도록 돕는 역할을 합니다.
사용 이유:
부모 클래스의 초기화 작업 상속: PySide6에서 QWidget이나 다른 위젯 클래스는 많은 내부 초기화 작업을 수행합니다. 따라서 이를 제대로 초기화하지 않으면 프로그램이 정상적으로 동작하지 않을 수 있습니다.
중복 코드 방지: 부모 클래스에서 정의된 메서드를 그대로 활용하여 코드 중복을 줄입니다.
예시:
부모 클래스의 __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") # 윈도우 제목 설정
핵심 설명:
super(PriceApp, self).__init__():
부모 클래스(QWidget)의 초기화 작업을 호출합니다.
여기서 PriceApp 클래스가 QWidget을 상속받았기 때문에, QWidget의 모든 기능을 사용하려면 이를 호출해야 합니다.
self.ui = Ui_Widget() 및 self.ui.setupUi(self):
Ui_Widget은 아마도 Qt Designer로 생성된 UI 클래스일 것입니다.
setupUi(self)를 호출하여, UI 요소들을 self 객체(즉, PriceApp 인스턴스)에 적용합니다.
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

