파이썬 강좌(초급)/8.클래스

8.클래스 - 7) pass, super 키워드

파기차차 2024. 4. 1. 08:01
728x90
반응형
SMALL

 

 

1) pass 키워드가 뭐에요?

pass는 파이썬에서 아무런 동작을 수행하지 않고, 그냥 넘어가는 키워드입니다. 주로 코드 블록이나 함수, 클래스 등을 정의할 때 구현이 필요하지 않은 부분을 표시하기 위해 사용됩니다.

# 구현이 필요한 부분
def example_function():
    # 여기에는 구현이 필요함
    pass  # 현재는 아무런 동작도 하지 않음
    # 나중에 구현할 코드를 작성할 예정
 
# 클래스 정의
class ExampleClass:
    def example_method(self):
        # 여기에는 구현이 필요함
        pass  # 현재는 아무런 동작도 하지 않음
        # 나중에 구현할 코드를 작성할 예정

위 코드에서 pass 키워드는 함수 example_function과 메서드 example_method 내부에 구현이 필요한 부분이 있음을 나타냅니다. 현재는 아무런 동작도 하지 않지만, 나중에 해당 부분을 구현할 예정이라는 것을 표시하는 용도로 사용됩니다. 따라서 pass 키워드를 사용하여 파이썬 구문 에러를 방지하고, 나중에 구현할 부분을 나타낼 수 있습니다.

 

2) super 키워드가 뭐에요?

super() 함수는 파이썬에서 부모 클래스의 메서드를 호출할 때 사용됩니다. 이를 통해 자식 클래스에서 부모 클래스의 메서드를 더 간단하게 호출할 수 있습니다.

# 부모 클래스
class Parent:
    def __init__(self):
        self.parent_attribute = "부모의 속성"
 
    def parent_method(self):
        print("부모의 메서드 실행")
 
# 자식 클래스
class Child(Parent):
    def __init__(self):
        super().__init__()  # 부모 클래스의 __init__ 메서드 호출
        #Parent.__init__(self) # 위와 동일하게 부모 클래스의 __init__ 메서드 호출, 위 방식으로 호출시 self를 없애 주어야 함
        self.child_attribute = "자식의 속성"
 
    def child_method(self):
        super().parent_method()  # 부모 클래스의 parent_method 호출
        print("자식의 메서드 실행")
 
# 자식 클래스의 객체 생성
child = Child()
 
# 부모 클래스의 속성 및 메서드 호출
print(child.parent_attribute)  # 출력: 부모의 속성
child.parent_method()  # 출력: 부모의 메서드 실행
 
# 자식 클래스의 속성 및 메서드 호출
print(child.child_attribute)  # 출력: 자식의 속성
child.child_method()  # 출력: 부모의 메서드 실행
                      #       자식의 메서드 실행

위 코드에서 super() 함수를 사용하여 자식 클래스인 Child에서 부모 클래스인 Parent의 메서드와 속성을 호출하고 있습니다. super().__init__()은 부모 클래스의 __init__() 메서드를 호출하여 부모 클래스의 속성을 초기화하고, super().parent_method()은 부모 클래스의 parent_method()를 호출합니다.

 

 

 

 

3) 다중상속에서 super 사용 시 발생하는 문제를 해결하는 방법

# 부모 클래스 A
class A:
    def __init__(self):
        print("부모 클래스 A의 초기화 메서드")
 
    def method_A(self):
        print("부모 클래스 A의 메서드")
 
# 부모 클래스 B
class B:
    def __init__(self):
        print("부모 클래스 B의 초기화 메서드")
 
    def method_B(self):
        print("부모 클래스 B의 메서드")
 
# 자식 클래스
class Child(A, B): # 부모클래스 A와 B를 상속받고 있음
    def __init__(self):
        super().__init__()  # 부모 클래스 A의 초기화 메서드 호출
        super().method_A()  # 부모 클래스 A의 메서드 호출
        super().__init__()  # 부모 클래스 B의 초기화 메서드 호출하기를 기대하지만 부모 클래스 A의 초기화 메서드 호출
        super().method_B()  # 부모 클래스 B의 메서드 호출
 
# 자식 클래스의 객체 생성
child = Child()

위의 소스코드 실행 시 순서대로 실행하면 아래와 같습니다.

부모 클래스 A의 초기화 메서드

부모 클래스 A의 메서드

부모 클래스 A의 초기화 메서드 (우리는 원래 '부모 클래스 B의 초기화 메서드' 를 기대하였지만, 그렇게 되지 않았습니다.)

부모 클래스 B의 메서드

위와 같이 나오면서 우리가 기대한 부모 클래스 B의 초기화 메서드 는 나오지 않습니다.

이는 다중상속에서 아래와 같이 부모클래스의 상속 첫번째 순서(A)만 호출하기 때문입니다.

class Child(A, B):

 

따라서 위의 소스는 다중상속시 super 키워드를 사용하지 말고, 아래와 같이 수정해 주어야 합니다.

# 부모 클래스 A
class A:
    def __init__(self):
        print("부모 클래스 A의 초기화 메서드")
 
    def method_A(self):
        print("부모 클래스 A의 메서드")
 
# 부모 클래스 B
class B:
    def __init__(self):
        print("부모 클래스 B의 초기화 메서드")
 
    def method_B(self):
        print("부모 클래스 B의 메서드")
 
# 자식 클래스
class Child(A, B):
    def __init__(self):
        A.__init__(self)  # 부모 클래스 A의 초기화 메서드 호출
        A.method_A(self)  # 부모 클래스 A의 메서드 호출
        B.__init__(self)  # 부모 클래스 B의 초기화 메서드 호출
        B.method_B(self)  # 부모 클래스 B의 메서드 호출
 
# 자식 클래스의 객체 생성
child = Child()

 

 

 

 

4) 실습

 

(1) 아래 코드가 동작하도록 '차' 클래스를 수정해 보세요

>>bicycle = 자전거(2,100,"시마노")
>>bicycle.정보()
바퀴수 2
가격 100

 

모범답안

더보기
class 차:
    def __init__(self, 바퀴, 가격):
        self.바퀴 = 바퀴
        self.가격 = 가격

    def 정보(self):
        print("바퀴수 ", self.바퀴)
        print("가격 ", self.가격)

class 자동차(차):
    def __init__(self, 바퀴, 가격):
        super().__init__(바퀴, 가격)

class 자전거(차):
    def __init__(self, 바퀴, 가격, 구동계):
        super().__init__(바퀴, 가격)
        self.구동계 = 구동계

bicycle = 자전거(2, 100, "시마노")
bicycle.정보()

 

 

 

(2) 아래 코드의 실행결과가 어떻게 될지 생각해 보세요.

class 부모:
  def __init__(self):
    print("부모생성")

class 자식(부모):
  def __init__(self):
    print("자식생성")
    super().__init__()

나 = 자식()

 

 

 

모범답안

더보기
자식생성
부모생성
728x90
반응형
LIST