딥상어동의 딥한 생각

[Python] 클래스와 상속 기초 예제

by 딥상어동의 딥한생각
가짜연구소 내 Python - Data Engineering 스터디를 위해 작성했습니다. 

https://www.notion.so/chanrankim/PseudoLab-c42db6652c1b45c3ba4bfe157c70cf09

(가짜연구소 링크)

https://www.notion.so/chanrankim/Data-Engineer-Python-83c206a662004120a8211a800581e124

(스터디상세 링크)

상속은 뒤를 있는다는 뜻으로 보통 재산 관련 권리에 대한 의무를 넘겨받는 것을 뜻한다. 위 짤은 정치적인 의도는 전혀 없고.. 재산 상속 관련된 짤을 찾아봤는데 마땅한게 없어서 가져왔다.

 

0. 클래스에서 상속이란

 

클래스에서 상속도 마찬가지. 자식 클래스가 부모 클래스의 능력을 이어 받는 것을 의미한다. 그렇다면, 어떻게 상속할까? 간단하다.

 

class Parent:
    ...
    ...
    
class HelloDaddy(Parent):
    ...
    ...

자식 클래스에서 부모 클래스를 파라미터로 지정해주면 끝!

 

https://news.nate.com/view/20160526n32627

그러면 이렇게 똑 닮은..? 자식 클래스가 태어난다(남희석님과 남희석아버님 정말 닮으심..). 하지만, 그게 끝은 아니고 자식 클래스는 부모 클래스의 능력 + 새로운 능력을 가질 수도 있다.

 

다만.. 현실에서의 상속과 클래스 상속의 다른 측면은 클래스 상속의 경우 -는 없다는 것이다. 부모 클래스의 모든 것을 그대로 이어 받을 수 있다.

 

1. Kpi클래스

 

비즈니스에서 성과를 판단하는 핵심 지표를 KPI라고 하는데 오늘은 몇 가지 KPI를 통해 클래스 상속 개념에 대해 설명해보려고 한다.

 

class Kpi:
    def __init__(self, dau, pu, sales):
    	# dau: 일간 방문자수
        self.dau = dau
        # pu: 구매 유저수
        self.pu = pu
        # sales: 구매 총액 
        self.sales = sales

    def arppu(self):
        return self.sales/self.pu

    def arpu(self):
        return self.sales/self.dau

    def kpi_message(self):
        print('You can calculate kpi_metric using this class')

위와 같이 arpu(전체 고객들의 평균 과금액), arppu(과금 고객들의 평균 과금액)을 구하는 Kpi클래스를 만들어보았다.

 

kpi_parent = Kpi(1000, 70, 300000)
kpi_parent.__dict__

 

생성후 위와 같이 코드를 입력해보면 아래와 같은 속성을 가진 클래스 인스턴스가 생성 됐다는 것을 알 수 있다.

 

kpi_parent.arppu()
kpi_parent.arpu()

arppu와 arpu가 위와 같이 구해지는 것을 알 수 있다.(arpu의 모수는 전체 유저이기 때문에 과금 유저 대상인 arppu보다 더 값이 작다.)

 

kpi_parent.kpi_message()

이런 메시지도 잘 출력되는 것을 알 수 있다.

 

2. KpiAdvance 클래스

 

이제, 위의 Kpi 클래스를 상속받아 추가적인 지표를 연산해보려고 한다. 고착도와 리텐션을 계산하는 클래스를 만들어 볼 것이다. 고착도는 (dau/mau) * 100으로 월간 방문 유저수 대비 일간 방문 유저수의 비율이다. 고착도가 낮으면 아 하루 들어오고 다들 나갔구나 이런식으로 생각해볼 수 있다. 다만, 고착도가 높고 낮고에 대한 판단은 산업군 마다 다르다. 

 

리텐션은 말 그대로 유지율이다. n일에 들어왔던 유저들이 n+m일에 몇명이나 들어왔는지를 나타내는 지표다.

 

class KpiAdvance(Kpi):
    def __init__(self, dau, pu, sales, mau, dau_plus_1day):
        Kpi.__init__(self, dau, pu, sales)
        # 월 접속자수
        self.mau = mau
        # 1일 후에 접속한 유저수
        self.dau_plus_1day = dau_plus_1day

    def stickiness(self):
        return self.dau/self.mau

    def retention_1day(self):
        return self.dau_plus_1day/self.dau

여기서 한 가지 주의할점은 instance 레벨의 속성들은 모두 child class에 다시 한번 할당해줘야 한다는 것이다. 만약, 저기서 dau/pu/sales 중 하나라도 빼먹으면 파라미터 숫자가 맞지 않다는 에러 발생한다. 즉, 부모클래스의 인스턴스 속성 + 자식 클래스의 인스턴스 속성 = 파라미터 숫자가 되는 것이다.

 

kpi_child = KpiAdvance(1000, 70, 300000, 10000, 300)
kpi_child.__dict__

위와 같이 총 5개의 인스턴스 속성이 정의된 것을 알 수 있다.

 

kpi_child.stickiness()
kpi_child.retention_1day()

위와 같이 고착도와 리텐션이 계산된 것을 알 수 있다.

 

kpi_child.kpi_message()

또한, 부모 클래스의 기능을 상속받아 위와 같이 kpi_child 클래스 내에서 정의하지 않은 메시지 뿐만 아니라

 

kpi_child.arpu()
kpi_child.arppu()

arpu와 arppu 연산 기능까지 사용할 수 있다. 

 

3. 클래스 작성 시 PEP8

 

+클래스 작성시 지켜야 할 PEP8 몇가지

 

1. 클래스와 클래스 사이 빈칸은 두줄

2. 클래스 내 함수와 함수 사이 빈칸은 한줄

3. 클래스 이름 첫글자는 대문자 그리고 대문자로 경계 구분

4. 함수는 소문자 그리고, 언더바로 경계 구분

5. 클래스 선언 후 클래스 인스턴스를 할당할 시에는 빈칸을 두줄 사용

블로그의 정보

딥상어동의 딥한생각

딥상어동의 딥한생각

활동하기