23.03.10파이썬 상속,

색인

1. Python의 객체 지향 프로그래밍

  • 사유지
  • 재정의 방법
  • 다중 상속

2. 파이썬의 특별한 방법

  • 특별한 방법

17.상속인.ipynb


1-1 유산

  • 이전에 정의된 클래스의 기능을 상속합니다.
  • 기존 클래스의 일부 기능을 추가하거나 변경하여 새 클래스를 정의할 수 있다는 개념입니다.
  • 코드 재사용 가능
  • 안정적이고 손쉬운 관리
  • 부모, 부모, 슈퍼 또는 기본 클래스로 상속할 기존 클래스를 호출합니다.
  • 새로 상속된 클래스를 자식, 자식 또는 하위 클래스라고 합니다.

예 ) 잘 활용하고 있는 동물교실


  • Dog 클래스에서 사용하고 싶어서 Animal 클래스를 물려받았습니다.
  • 그러나 상위 클래스를 사용하는 경우 부모 클래스의 속성 값상속되기도 합니다. 따라서 인수 값은 부모 클래스에 정의된 형태로 사용해야 합니다. 양식이 다르면 오류 세대 아마도.
    • 상위 클래스: 동물
    • 어린이 반: 개


  • 인수 값이 지정되지 않았기 때문에 위에서 오류가 발생합니다.
  • 아래 이미지에서 보시는 것처럼 일반 인자 값을 입력했는데 문제 없이 사용이 가능했습니다.


1-2 방법 재정의

  • 부모 클래스 메서드 재정의
  • 키즈 클래스 인스턴스 호출도시 덮어쓰기방법라고
  • 하위 클래스에 있는 메서드는 상위 클래스에서 호출할 수 없습니다.

예) 메서드 재정의를 위한 기본 설정


  • 아래 코드를 주석 처리하고 다시 시도하십시오.
def eat(self, food):             #매소드 오버라이딩
 print(f'{self.name}는 {food}를 아주~ 맛있게 먹습니다.')


  • 부모 클래스(=Animal)에서 eat 메서드의 결과 값이 변경된 것을 확인할 수 있습니다.
    • 자식 클래스(=Dog)에서 부모 클래스(=Animal)에 존재하는 eat 메소드를 변경하여 결과 값이 변경되었는지 확인할 수 있습니다.
  • 하위 클래스에 있는 메서드는 상위 클래스에서 호출할 수 없습니다.


1-3.다중 상속

  • 프로그래밍 언어 C# 및 Java에서는 다중 상속이 불가능합니다.
  • Python은 C++과 같은 다중 상속 언어입니다.
    • 여러 클래스를 상속할 수 있습니다. (숫자는 무제한입니다.)

// 더 많은 상속을 받을수록 프로그램 자체가 더 모호하고 어려워질 수 있습니다.

예) 예제에 대한 기본 클래스 만들기


잘 작동하는 것을 확인할 수 있습니다.


class name.mro()를 실행할 때 ‘class name’이 상속받은 클래스를 확인할 수 있습니다.



18.특별한 방법.ipynb


  • ‘__’ 밑줄2
  • __로 시작하고 __로 끝나는 특수 함수 // __main__ // __init__ …..
  • 이러한 메서드를 다시 구현하면 다양한 내장 Python 함수 또는 연산자의 원하는 기능을 개체에 제공할 수 있습니다.

예 )


#기본 생성자있는 클래스
class Point:
  def __init__(self, x, y):
    self.x = x
    self.y = y

  def print_point(self):    #결과 값이 (3,4) 이렇게 보였으면 한다.
    print(f'({self.x} , {self.y})')

  def __str__(self):        # str() 함수를 오버라이딩 해줌.
    return (f'({self.x} , {self.y})')

  def __add__(self, pt):     # + 연산자를 오버라이딩 한다. (객체 + 객체)
    new_x = self.x + pt.x
    new_y = self.y + pt.y

    return Point(new_x, new_y)

  def __sub__(self, pt):     # - 연산자를 오버라이딩 (객체 - 객체)
    new_x = self.x - pt.x
    new_y = self.y - pt.y
    return Point(new_x, new_y)

  def __len__(self):          # len() 함수 오버라이딩 : 
    return self.x + self.y

  def __getitem__(self, index):   # 인덱싱을 오버라이딩 (객체(인덱스))   
                                                                # 지금 형태가 ( 3 , 4 ) 형식이니깐 
    if index == 0 :               # 인덱스가 0 이면 x를 출력    # x = 3
      return self.x               
    elif index == 1:              # 인덱스가 1 이면 y를 출력    # y = 4
      return self.y
    else:                         # 0 , 1 이 아니라면 -1 출력 
      return -1

값을 확인해 봅시다.


p1에서 객체를 생성할 때 어떤 값이 입력되었는지 확인하는 함수 호출


특수 메서드 코드

  def print_point(self):    #결과 값이 (3,4) 이렇게 보였으면 한다.
    print(f'({self.x} , {self.y})')

결과 값(str() 메서드를 특수 메서드로 사용)

  • 특별한 방법을 사용하기 전에


  • 특수 메소드 코드 적용 후


특수 메서드 코드

  def __str__(self):        # str() 함수를 오버라이딩 해줌.
     return (f'({self.x} , {self.y})')

결과 값(‘+’는 특별한 방법임)

  • 특별한 방법을 사용하기 전에


  • 특별한 방법을 사용한 후


특수 메서드 코드

  def __add__(self, pt):     # + 연산자를 오버라이딩 한다. (객체 + 객체)
    new_x = self.x + pt.x
    new_y = self.y + pt.y

    return Point(new_x, new_y)

결과 값(‘-‘은 특수 메소드임)

  • 특별한 방법을 사용하기 전에


  • 특별한 방법을 적용한 후


특수 메서드 코드

  def __sub__(self, pt):     # - 연산자를 오버라이딩 (객체 - 객체)
    new_x = self.x - pt.x
    new_y = self.y - pt.y
    return Point(new_x, new_y)

결과 값(특수 메소드로서의 함수 len())

  • p1 객체 타입 자체는 len 함수를 사용할 수 없기 때문에 사용할 수 있도록 변경해 주면 좋겠습니다.
  • 특별한 방법을 사용하기 전에


  • 특별한 방법을 적용한 후


특수 메서드 코드

  def __len__(self):          # len() 함수 오버라이딩 : 
    return self.x + self.y

결과 값(인덱싱을 사용하는 특별한 방법)

  • 특별한 방법을 사용하기 전에


  • 특별한 방법을 적용한 후


특수 메서드 코드

  def __getitem__(self, index):   # 인덱싱을 오버라이딩 (객체(인덱스))   
                                                                # 지금 형태가 ( 3 , 4 ) 형식이니깐 
    if index == 0 :               # 인덱스가 0 이면 x를 출력    # x = 3
      return self.x               
    elif index == 1:              # 인덱스가 1 이면 y를 출력    # y = 4
      return self.y
    else:                         # 0 , 1 이 아니라면 -1 출력 
     return -1