회사에서 새로운 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에 구현할 수 있는지 확인하자.
실험
코드
classParent():def__init__(self, name: str, age: int, for_what: str) -> None:
self.name = name
self.age = age
self.for_what = for_what
defexecute(self) -> None:
message = self._internal_method()
print(f"My name is {self.name}")
print(message)
def_internal_method(self) -> str:return"PARENT IS SUPER!"classChild(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를 사용했다는 뜻이다.