파이썬 with override & super

oswaldeff·2021년 8월 1일
0
post-thumbnail

📗 override

class TheMatrix:
    def __init__(self):
        self.person = 'person'
        self.smith = 'smith'
        self.neo = 'neo'
        self.line = 'Call trans opt: received. 2-19-98 13:24:18 REC:log'

class TheMatrixReloaded(TheMatrix):
    def _smith(self):
        self.person = 'smith'
        print(f'line: {self.smith} infects a man')
        print(f'line: The man becomes another {self.person}')
        self.line = 'Good bye, Mr. Anderson.'
        print(f'{self.smith}: ', self.line)

class TheMatrixRevolution(TheMatrix):
    def _neo(self):
        self.line = 'My name is Neo.'
        print(f'{self.neo}: ', self.line)

connection0 = TheMatrixReloaded()
connection1 = TheMatrixRevolution()

connection0._smith()
connection1._neo()

PS c:\Users> c:/Users/python.py

line: smith infects a man

line: The man becomes another smith

smith: Good bye, Mr. Anderson.

neo: My name is Neo.

상속은 말 그대로,
재산상속시 물려받은 재산을 사용할 수 있는 것처럼
클래스를 물려받아 사용하는 개념이다.

조금 더 자세히 말해 부모로 명명된 클래스를 자식 클래스로 물려받아
내부의 self객체나 함수를 이용할때 말하는 개념인데,
이러한 상속의 method에는 override와 super가 있다.

override는 자식클래스에서 부모클래스에서 정의된 함수나 객체에 대해 덮어쓰기 기능을 수행한다.
위의 TheMatrixReloaded클래스는 현재 TheMatrix클래스를 상속받고 있다.
이때 TheMatrix의 init에서 정의된 person, line에 대해
TheMatrixReloaded의 smith는 오버라이딩돼고 있다.

📗 super

class TheMatrix:
    def __init__(self):
        self.person = 'person'
        self.smith = 'smith'
        self.neo = 'neo'
        self.line = 'Call trans opt: received. 2-19-98 13:24:18 REC:log'

class TheMatrixReloaded(TheMatrix):
    def _smith(self):
        self.person = 'smith'
        print(f'line: {self.smith} infects a man')
        print(f'line: The man becomes another {self.person}')
        self.line = 'Good bye, Mr. Anderson.'
        print(f'{self.smith}: ', self.line)

class TheMatrixRevolution(TheMatrix):
    def _neo(self):
        self.line = 'My name is Neo.'
        print(f'{self.neo}: ', self.line)

class TheMatrixFour2021(TheMatrixRevolution):
    def _neo(self):
        super()._neo()

connection3 = TheMatrixFour2021()
connection3._neo()

PS c:\Users> c:/Users/python.py

neo: My name is Neo.

super는 부모클래스에서 정의된 함수에 대해 자식클래스에서도 그대로 사용하고 싶은 경우 사용하는데
특히, 특정 객체들에 대해 override 후 나머지 객체들을 그대로 사용하고 싶은 경우 super method를 사용하는것이 일반적이다.

위의 코드를 보면 TheMatrixFour2021은 TheMatrixRevolution을 상속받는 상황이다.
만약 TheMatrixFour2021클래스에서 neo함수아래에 기존객체에 대한 수정이나 새로운 객체를 선언할 경우 override를 하게되는 것이지만
super를 통해 TheMatrixRevolution클래스의 neo함수를 그대로 가져다 사용하겠다는 것을 선언해주는 내용이다.

이러한 용법은 django를 이용하다보면 종종 사용하게 된다.
특히 import한 라이브러리를 override해서 쓰는 경우가 종종 발생하는데 이때 super와 같이 적절히 사용한다면 일부 객체의 로직만 바꾸고 나머지 객체는 그대로 사용할 수 있어서 기능구현을 보다 쉽게 할 수 있는것 같다.

0개의 댓글