본문 바로가기

Language/Python

RePythonOOP 7일차 매직메소드 오버라이딩

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 공식 문서에 있다.