작성
·
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
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()를 사용해 부모 클래스의 초기화 메서드를 호출하는 것은 필수적입니다.
혹시 다른 부분이나 예제가 필요하시면 언제든 말씀해주세요! 😊
감사합니다. 김대진 드림.