색인
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