T.I.L (Python -클래스 class)

2023. 3. 24. 23:47T.I.L (Today_I_Learned)

설명 with 예시


# 임의의 자동차 회사 'H'사의 플랫폼 정책이 있습니다.
# 우선 'H'사만의 표준 자동차 구조(부모 클래스)를 만듭니다.
class Segments:
    def __init__(self, segment, model, engine_name, power_train_name,
                        steering_name, break_name, suspension_name):
        self.segment = segment
        self.model = model
        self.engine_name = engine_name
        self.power_train_name = power_train_name
        self.steering_name = steering_name
        self.break_name = break_name
        self.suspension_name = suspension_name

    def engine(self):
        print(self.segment, self.model, self.engine_name, sep='\n')

    def power_train(self):
        print(self.segment, self.model, self.power_train_name, sep='\n')

    def steering_system(self):
        print(self.segment, self.model, self.steering_name, sep='\n')

    def breaking_system(self):
        print(self.segment, self.model, self.break_name, sep='\n')

    def suspension_system(self):
        print(self.segment, self.model, self.suspension_name, sep='\n')


# 각 차급(자식 클래스, 서브 클래스)마다 표준 구조(부모 클래스)를 따라(상속받아) 구분 지어 만들어줍니다.


# 경차\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
class Asegment(Segments):
    def __init__(self, segment, model, engine_name, power_train_name,
                        steering_name, break_name, suspension_name):
        Segments.__init__(self, segment, model, engine_name, power_train_name,
                          steering_name, break_name, suspension_name)
# 표준 구조(클래스)를 설정해 놓았기 때문에 표준 구조를 이어 받은 해당 차급에서
# 굳이 새로운 기능(메소드)이 필요 없다면 기능(메소드)을 새로 만드는 작업을 하지 않아도 됩니다.
# 경차///////////////////////////////////////////////////////////////////////


# 차급이 올라감에 따라 추가 또는 수정되는 기능이 있습니다.
# 하지만 표준 구조(부모 클래스)가 이미 형성되어 있기에 작업이 어렵지 않습니다.
# 표준 구조(부모 클래스)의 포맷을 받아온(상속 받은) 다음 해당 차급(자식 클래스)의 구조에서
# 기능(메소드)을 추가 또는 수정해 줍니다.

# 여기서 중요한 것은 표준 구조(부모 클래스)를 건드리지 않고
# 표준 구조(부모 클래스)의 포맷을 받아와 만든 새로운 구조(자식 또는 서브 클래스)에서
# 기능(메소드)을 추가 또는 수정을 한다는 것 입니다.
# 표준 구조(부모 클래스)를 건드리면 영향을 받은 차급들의 구조(자식 클래스)에 문제가
# 발생할 수 있기 때문입니다.


# 준중형\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
class Csegment(Segments):
    def __init__(self, segment, model, engine_name, power_train_name,
                        steering_name, break_name, suspension_name, safety_name):
        Segments.__init__(self, segment, model, engine_name, power_train_name,
                          steering_name, break_name, suspension_name)
        self.safety_name = safety_name
        # 안전 보조장치를 추가하기 위해 준비를 합니다.

    def safety_assist(self):
        print(self.segment, self.model, self.safety_name, sep='\n')
# 표준 구조(부모 클래스)에서 받아온(상속받은) 구조(자식 클래스, 서브 클래스)에 안전 보조 장치만
# 추가해 줍니다.
# 준중형//////////////////////////////////////////////////////////////////////


# 중형\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
# 차급이 올라갈때 이전 차급의 구조를 포함하며 올라갑니다.
# 따라서 표준 구조를 바탕으로 기능의 추가가 이뤄졌던 이전 차급의 구조를 바탕으로 새로운 구조를
# 만들어 줍니다.
class Dsegment(Csegment):
    def __init__(self, segment, model, engine_name, power_train_name,
                        steering_name, break_name, suspension_name, safety_name, driving_assist_name):
        Csegment.__init__(self, segment, model, engine_name, power_train_name,
                          steering_name, break_name, suspension_name, safety_name)
        self.driving_assist_name = driving_assist_name

    def driving_assist(self):
        print(self.segment, self.model, self.driving_assist_name, sep='\n')
# 중형////////////////////////////////////////////////////////////////////////////


# 준대형\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
class Esegment(Dsegment):
    def __init__(self, segment, model, engine_name, power_train_name,
                        steering_name, break_name, suspension_name, safety_name, driving_assist_name,
                        vehicle_comfort_name):
        Dsegment.__init__(self, segment, model, engine_name, power_train_name, steering_name,
                          break_name, suspension_name, safety_name, driving_assist_name)
        self.vehicle_comfort_name = vehicle_comfort_name

    def vehicle_comfort(self):
        print(self.segment, self.model, self.vehicle_comfort_name, sep='\n')

# 'H'사는 'H'사의 준대형 대표 모델인 'brandeur'의 새로운 세대를 출시하려고 합니다.
# 그런데 기존에 중형 차량에서부터 적용하던 기능(메소드)이 준중형에 넣기에 조금 부족해서
# 'H'사는 새로운 세대로 출시될 'brandeur'에 해당 기능을 개선해서 적용 하려고 합니다.
# 그래서 참고한 상위 구조의 기능을 가볍게 수정을 해주려고 합니다.
    def driving_assist(self):
        print(self.segment, self.model, self.driving_assist_name,
              "중형 주행보조 시스템 성능 개선 ver.", sep='\n')
# 중형 자동차 구조(부모 클래스)에 있는 기능(메소드)을 이름(메소드명)은 동일하게 하고
# 받아와(불러와) 실제 기능부분(수행문)만 수정해서 다시 만드는 것 입니다.
# *(이를 메소드 오버라이딩(Overriding, 덮어쓰기)이라고 합니다.
# 이렇게 메서드를 오버라이딩하면 부모클래스의 메서드 대신 오버라이딩한 메서드가 호출됩니다.)*
# 준대형//////////////////////////////////////////////////////////////////////////


# 대형\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
class Fsegment(Esegment):
    def __init__(self, segment, model, engine_name, power_train_name,
                        steering_name, break_name, suspension_name, safety_name, driving_assist_name,
                        vehicle_comfort_name, luxury_name):
        Fsegment.__init__(self, segment, model, engine_name, power_train_name, steering_name,
                          break_name, suspension_name, safety_name, driving_assist_name, vehicle_comfort_name)
        self.luxury_name = luxury_name

    def luxury_interior(self):
        print(self.segment, self.model, self.luxury_name, sep='\n')
# 대형////////////////////////////////////////////////////////////////////////////////


# *('brandeur'라는 객체를 생산 했습니다! 'Esegment'class의 인스턴스인 'brandeur'를 생성했다고도 합니다.)*
# *(객체는 클래스의 클론(복제품)이라고 봐도 될 것 같습니다.
#  클론을 만들어 단지 해당 클론이 가지고 있는 값(인자)만 부여해 줄 뿐입니다.)*
tonata = Dsegment(
    "중형",
    "토나타",
    "중형 엔진",
    "중형 파워트레인 시스템",
    "중형 스티어링 시스템",
    "중형 브레이크 시스템",
    "중형 서스펜션 시스템",
    "중형 안전보조 시스템",
    "중형 주행보조 시스템",
)

# 'brandeur'(객체)가 가지고 있는 구조(메소드)를 불러와 볼 수 있습니다.
tonata.driving_assist()

brandeur = Esegment(
    "준대형",
    "브랜저",
    "준대형 엔진",
    "준대형 파워트레인 시스템",
    "준대형 스티어링 시스템",
    "준대형 브레이크 시스템",
    "준대형 서스펜션 시스템",
    "준대형 안전보조 시스템",
    "준대형 주행보조 시스템",
    "준대형 정숙성 향상 시스템"
)

# 'brandeur'(객체)가 가지고 있는 구조(메소드)를 불러와 볼 수 있습니다.
brandeur.driving_assist()

 

 

오버라이딩 결과 출력


'Esegment'클래스에서 'Dsegment'클래스의 메소드를 오버라이딩 해주고 난 후 

'브랜저'객체를 만들어 확인해 본 출력값 입니다.

'Esegment'클래스의 부모 클래스인 'Dsegment'크래스가 오버라이딩 결과에

영향을 받지 않았음을 확인할 수 있습니다.

'T.I.L (Today_I_Learned)' 카테고리의 다른 글

T.I.L (파이썬 턴제 게임 만들기)  (1) 2023.03.28
T.I.L (클래스 - 추가 정리)  (1) 2023.03.27
T.I.L (Python if문(조건문))  (0) 2023.03.24
T.I.L (딕셔너리)  (0) 2023.03.22
T.I.L (Python의 자료형 선언)  (1) 2023.03.21