배경
회사에서 새로운 Airflow Operator를 제작할 필요가 생겼다. 기존에 있는 Operator (Parent Operator)와 거의 유사한 동작을 하기 때문에, 상속을 통해 새로운 Operator(Child Operator)를 만들기로 결정했다. 새로 Child Operator는 다음 두 가지가 Parent Operator와 다르다.
- Parent Operator의 Instance 생성시 반드시 필요한 Parameter 중 일부가 Child Operator에서는 필요 없다.
- 가장 바깥에서 호출되는 execute Method는 Child Operator에서 동일하지만, execute 내부에서 사용하는 internal Method는 Parent와 다르다.
2가지 사항을 어떻게 Child Operator에 구현할 수 있는지 확인하자.
실험
코드
class Parent():
def __init__(self, name: str, age: int, for_what: str) -> None:
self.name = name
self.age = age
self.for_what = for_what
def execute(self) -> None:
message = self._internal_method()
print(f"My name is {self.name}")
print(message)
def _internal_method(self) -> str:
return "PARENT IS SUPER!"
class Child(Parent):
def __init__(self, parent_name: str, **kwargs):
super().__init__(for_what="", **kwargs)
self.parent_name = parent_name
def _internal_method(self) -> str:
return "CHILD IS OVERRIDER!"
if __name__ == "__main__":
c = Child(name = "HB", parent_name="Lee", age=27)
c.execute()
실행 결과
$ python class-inheritance/override_practice.py
>> My name is HB
>> CHILD IS OVERRIDER!
결론
- super().__init__()에서 기존 Parent를 선언하는데 반드시 필요했던 parameter for_what에 ""를 집어넣었다.
- 이게 효과적인 방법일지는 의문 - Python 자체에 class 상속후, 필수 parameter를 변경하는 방법은 없는 듯 하다
- "CHILD IS OVERRIDER!"가 출력됐다는 뜻은, execute에서 사용하는 _internal_method()가 override된 Child의 Method를 사용했다는 뜻이다.
'Computer Science > Python' 카테고리의 다른 글
[가상환경] pyenv를 통한 가상환경 설정 (goodbye conda) (0) | 2024.09.22 |
---|---|
[AWS Data Wrangler] awswrangler 에서 profile 바꾸기 (0) | 2022.06.08 |
[Crawling] BeautifulSoup, Selenium으로 회사 사이트에서 동명이인 찾기 (0) | 2022.04.19 |