인공지능을 좋아하는 곧미남

Python Class 상속, 오버라이딩, super() 내용 정리 및 코드 본문

code_study/python 내장함수

Python Class 상속, 오버라이딩, super() 내용 정리 및 코드

곧미남 2022. 1. 10. 13:54

안녕하세요 오늘은 Python Class 상속에 관한 내용과 실제로 pytorch 패키지의 torch.nn.Module을 활용한 예를 보겠습니다.

 

파이썬에서 클래스 상속은 자식과 부모의 관계로 나누어집니다.

 

여기서, super()함수를 이용해서 부모 클래스의 메서드나 파라미터를 자식 클래스에서 사용할 수 있습니다.

 

오늘의 내용은 아래와 같습니다.

 

< INDEX >

1. 클래스 상속 방법

 

2. super() 사용 방법

   1) 단순 방법

   2) 심화 방법

 

3. 클래스 상속 오류 AttributeError: cannot assign module before Module.__init__() call 


1. 클래스 상속 방법

- 코드에서 선언 방법: class 자식클래스명(부모클래스명)

 

- 클래스 상속의 역할

클래스는 자식 클래스와 부모 클래스로 분류됩니다. 이때 자식 클래스에서 부모 클래스의 메서드나 파라미터를 전달 받아 사용할 수 있으면 두 클래스의 내용을 인터페이스 하여 구현할 수 있습니다. 이런 강력한 방법은 딥러닝 아키텍쳐를 구현할때, 데이터 로더나 모델을 구축할 때도 많이 사용하게 됩니다. 오늘은 간략한 내용을 토이 프로젝트를 통해 알아보겠습니다.

 

우선, 클래스 상속에 관해 알아보겠습니다. 아래 예제를 통해 설명드리자면,

 

- 아래 -

- 코드 생성 -

1) Parents 클래스 생성 - 1~3 Line

2) Child 클래스를 생성하고 Parents 클래스를 상속받음 - 6 Line

3) Child 클래스에서 def __init__(self, name) 메서드를 선언하여 name이라는 파라미터를 Child 클래스 생성자를 선언할때 전달 받습니다. 7~8 Line

4) Child의 tell_name이라는 메서드를 정의합니다. 11 ~ 12 Line

- 출력단 -

5) 15 Line에서 첫번째 파라미터인 name에 "아무개"를 전달하기 위해 A변수에 Child("아무개")클래스를 생성자로 선언합니다. 이때 Child 클래스가 생성됨과 동시에 def __init__ 메서드에 접근되어 해당 하위 내용을 수행합니다.

6) 16 Line에서 A.tell_name()을 선언하여 Child 클래스 내부 메서드인 tell_name에 접근하여 하위 내용을 수행합니다.

7) 17 Line에서 A.pretty()를 선언하여 Child 클래스에서 상속한 Parents 클래스의 pretty 메서드로 접근하여 하위 내용 수행합니다.

 

따라서, 한줄로 설명하면 A객체에 Child 클래스를 생성하는데 Parents 클래스를 상속 받은 Child 클래스니까 pretty 메서드를 호출할 수 있습니다. 이런 과정은 디버그를 직접해보시면서 어떤 순서로 수행되는지 직접 해보시면 이해가 쉽습니다.

 

출력내용:

2. super() 사용방법

- super()의 역할: 오버라이딩이 되더라도, 자식 클래스에서 부모 클래스의 내용을 사용하고 싶은 경우 사용

* 오버라이딩: 부모 클래스를 상속받은 자식 클래스에서 동일한 메서드명이나 파라미터명을 사용하게 된다면, 자식 클래스의 정보로 그냥 덮어 씌워져서 부모 클래스의 메서드나 파라미터를 상속받아 사용하지 못함

- 출력내용: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ. <- 출력됨으로 부모 클래스의 handsome()메서드는 자식 클래스의 handsome() 메서드에 덮어씌워져 자식 클래스의 handsome() 메서드가 호출됨.

 

오버라이딩이 되었을때 super()를 사용하여, 문제를 해결한다!

 

1) 단순 방법: 똑같은 메서드 명의 메서드를 만들고 그 밑에 "super.메서드명()" 형식으로 선언해주면된다.

- 출력내용: Child 클래스의 handsome() 메서드에 접근해서 "ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ."을 출력하고 super().handsome()에서 Parents 클래스의 handsome() 메서드로 접근되어 "멋지다"를 출력한다.

2) 심화 방법: def __init__(self, a, b, c, d) 메서드 하위에 super(자식클래스명, self).__init__(a, b, c, d)를 선언하여 a, b, c, d 변수들을 부모 클래스에 전달하여 사용시킴!

 

Parents 클래스에 변수들을 전달하고 싶을 때 사용!

class 자식(부모):
     def __init__(self, a, b, c, d):
         super(자식클래스명, self).__init__(a, b, c, d)

이런식으로 super(자식클래스명, self).__init__(a, b, c, d)를 자식 클래스 __init__()메서드 내에 선언해주면 부모 클래스 __init__을 실행하고 부모 클래스의 변수로 a, b, c, d를 전달한다.

 

결과가 동일하게 나오는지 직접 수행해보시길 바랍니다. ㅎㅎ


3. 클래스 상속 오류 AttributeError: cannot assign module before Module.__init__() call 

이 에러는 nn.Module을 상속받은 class가 __init__에서 먼저 super의 __init__을 호출하지 않아서 발생하는 문제이다.

super(Encoder).__init__()으로 선언해버리면 super의 __init__을 제대로 호출하지 못해 오류가 발생합니다.

 

따라서, super(Encoder, self).__init__() 이와 같이 코드를 변경해야합니다.

 

감사합니다.

 

 

'code_study > python 내장함수' 카테고리의 다른 글

OrderedDict는 딥러닝에서 어떻게 사용될까?  (0) 2022.02.08
Packing, Unpacking  (0) 2022.01.17
Python 내장함수 setattr()와 getattr()  (0) 2022.01.13
가정 설정문 assert  (0) 2022.01.11
[python] __call__  (0) 2021.12.17
Comments