[짤막] 상속

Jeong SeongYun·2022년 7월 17일
0

짤막

목록 보기
4/16
post-thumbnail

Pytorch를 이용해 모델링을 하다보면 보통 아래와 같은 구조를 마주합니다.

  
...
class CustomDataset(Dataset) :
	def __init__ (self, param1, param2, param3 ... ) :
    	self.param1 = param1
        self.param2 = param2
        self.param3 = param3

	def __len__ (self) :
    	return len(~~)

	def __getitem(self, idx) :
    	~~
        ~~
        return idx
        
class model (nn.Module) :
	def__init__(self, ~~ ) :
    	super(model, self).__init__()
        self.model = ~~~~~
        
    def forward(self, x) :
    	x = self.model(x)
        return x

...
  
  

보통 데이터셋을 정의하는 class와 모델 그 자체와 학습시 순방향을 정의하는 class를 적어주죠.

근데 그 class 옆에 Dataset과 nn.Module이라는 애들이 있습니다. 여기서 상속의 개념이 필요한 것이죠.

단순 상속

상속 : 부모 class로부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것

상속의 의미와 너무나도 맞게, 쉽게 말해서 부모가 쓰던 걸 자식이 쓸 수 있게 해준다는 겁니다.
간단한 예시를 들어보겠습니다.

class Parent() :
    def __init__ (self, house, car, money) :
        self.house = house
        self.car = car
        self.money = money

        
class Child(Parent) :
    pass
    

부모가 집, 차, 돈을 가지고 있고 Child class는 Parent를 상속 받고 있습니다.

위에서 나온 말대로라면 Child는 Parent를 상속 받았으니 부모가 쓰던 걸 쓸 수 있어야겠죠?

JaSik = Child('Apt','Tico',10000)
print(JaSik.house)
print(JaSik.car)
print(JaSik.money)

Output
Apt
Tico
10000

분명 child class엔 아무 것도 작성하지 않았는데 부모에서 사용했던 parameter를 그대로 사용할 수 있었습니다.

이런 식으로 자식 class는 상속 받은 부모 class의 parameter를 사용할 수 있습니다.

자식 class 에서 추가적으로 parameter를 정의해주고 상속받은 부모의 parameter도 사용하고 싶다면 super()를 사용합니다.

super()

class Parent() :
    def __init__ (self, house, car, money) :
        self.house = house
        self.car = car
        self.money = money
        
    def HIHI (self) : 
        print('안녕하세요')        
        
class Child(Parent) :
    def __init__(self, house, car, money, job) :
        super().__init__(house, car, money) 
        self.job = job
        
    def myjob(self) : 
        super().HIHI() 
        print(f'그리고 제 직장은{self.job}입니다.')

위의 함수에서 좀 내용을 추가해봤습니다.

super()는 상속의 주체인 부모 class를 의미하고 (self랑 비슷하죠) 그 옆에 그대로 이용하고자 하는 대상을 넣으시면 됩니다.

부모 class의 __init__ 을 쓰고 싶다면 super().__init__()을 쓰고 부모 class의 HIHI 함수를 쓰고 싶다면 super().HIHI()를 하면 자식도 그대로 그 함수를 사용할 수 있는 것이죠.

super()의 예시로 myjob을 자식 class에서 사용해보겠습니다.

JaSik = Child('Apt','Tico',10000, 'Data Analyst')
JaSik.myjob()

Output
안녕하세요
그리고 제 직장은 Data Analyst입니다.

자식 class에는 "안녕하세요" 라는 문구를 출력하는 함수가 없었는데 출력 되었습니다.
super().HIHI()를 통해 부모의 함수를 물려 받았기 때문에 자식 class에 있는 myjob을 호출 했을 때 HIHI()의 내용까지 나오는 겁니다.

이제 좀 감이 잡히죠?

profile
물어보면 대답해줄 수 있는 데이터쟁이

2개의 댓글

comment-user-thumbnail
2022년 7월 20일

상속하면 상속세만 생각남

1개의 답글