Insight
1.파이썬이 객채 생성시 매직메소드로 미리 함수적인 기능들은 만들어 준다
2.뭔가 내장 함수 명령어가 안된다면(대게 코더~ 잘못) I/O와 dir()함수로 보고 그에 맞게 코딩해주면 된다.
3.필요한 기능을 매직 메소드로 오버 라이딩하여 고칠 수 있다.
4. 메소드 오버로딩은 디폴드 값 사용, 가변또는 키워드인자로 만 사용 가능하다.
5. 코딩을 할 시 기능적 제약이 있으면 본인이 기능을 만들면서 고칠수 있다.
사전 지식
1.데이터의 모든 자료형은 클래스이다!
print(int) #<class 'int'>
print(str) #<class 'str'>
더 이상 안쳐도 되겠지만 항상 class를 출력합니다.
그래서 위의 말을 증명 할 수 있습니다.
모든 속성 및 메소드는 dir() 함수로 확인이 가능합니다.
dictionary라고 이 참에 같이 외웁시다.
2. 메소드 오버라이딩
기존의 파이선 클래스의 매직 메소드로 정의 된 것을
저희 방식대로 재정의 하는 것입니다.
이 말이 와닿지 않으신 다면,
이 말은 밑의 예제를 보고 이해하심이 편합니다.
저만의 사용자 정의 클래스를 하나 생성해보겠습니다.
회사 클래스를 만들 것이고 기존 클래스의 매직 메소드를
사용자 정의 클래스로 오버라이딩이 어떻게 진행되는지 보겠습니다
원래 인스턴스 간의 속성 값 비교가 아닌 인스턴스 자체의 비교 연산과
뺄샘 연산을 가능하게 해보겠습니다.
class Wework:
def __init__(self, name, year):
self._name = name
self._year = year
def __str__(self):
return 'student info: {}, {}'.format(self._name, self._year)
# 기존 대상, 비교대상을 정의하고 grater equal 과 Less equal 매직 메서드를 사용해 보자
def __ge__(self, x):
print('>=')
if self._year >= x._year :
return True
else :
return False
def __le__(self, x):
print('<=')
if self._year <= x._year :
return True
else :
return False
def __sub__(self, x):
print('__sub__')
return self._year - x._year
# 회사 인스턴스를 만들어 주자
co1 = Wework('Wecode', 2019)
co2 = Wework('Aeine', 2018)
2. 메소드 오버라이딩 예시 설명
print(dir(co1))
#['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',
#'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__',
#'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
#'__repr__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__',
#'__weakref__', '_name', '_year']
print(co1.__sizeof__()) # 32
저는 여기서 분명 __sizeof__(데이터의 크기)를 정하지 않았음 에도 불구하고 기본 32비트가 지정되어 있습니다.
이러하듯 파이썬은 자료형별로 선언과 할당시 미리 매직메소드를 만들어서 기본으로 제공해 주고
기본으로 제공해 준 것을 사용자가 재지정해 주는 것을 메소드 오버라이딩이라고 합니다.
물론 사용자 정의 함수도 지정할 수 있습니다.
다시 본론으로 넘어가서
클래스끼리 더하기와 같은 연산이 가능할가요?
print(co1 + co2) # TypeError: unsupported operand type(s) for +: 'Wework' and 'Wework'
당연히 에러가 납니다.
하지만 비교 연산자 매직 메서드를 오버라이딩 하면 어떨가요?
dir()로 안의 매직 메서드들을 오버 라이딩을 함으로서
새롭개 함수를 짜는 내가 재정의 가능하다
아래에 '>='는 __ge__를 의미한다
클래스 내에 __ge__ 함수의 파라미터 왼쪽 self는 왼쪽 co1이 들어가고
오른쪽 x는 오른쪽 co2로 들어간다
# __ge__를 오버라이딩 정의하고 호출한다.
print(co1 >= co2) # >= True
위의 __sub__ 매직 메서드로 각 회사들의 창업 년도를 빼본다면요?
# __sub__를 오버라이딩 하고 재정의 한다.
print(co1 - co2) # __sub__ 1
# 매직메소드의 더 자세한 내용은 https://docs.python.org/2.0/ref/specialnames.html 공식 문서에 있다.
'Language > Python' 카테고리의 다른 글
RePythonOOP 9일차 파이썬 컨테이너 VS 플랫, 가변 VS 불변, 리스트 컴프리 핸션 (0) | 2019.12.07 |
---|---|
RePythonOOP 8일차 매직메소드 오버라이딩 심화 (+ bool()) (0) | 2019.12.07 |
RePythonOOP 6일차 네임드 튜플 클래스 응용 해 보기 (0) | 2019.12.04 |
RePythonOOP 4일차 파이썬의 데이터 모델 , 네임드 튜플 , 속성과 메소드 들 (0) | 2019.11.30 |
RePythonOOP 3일차 객체의 메서드들 ( 클래스 메서드, 인스턴스 메서드, 스테틱 메서드) (0) | 2019.11.28 |