배경

회사에서 새로운 Airflow Operator를 제작할 필요가 생겼다. 기존에 있는 Operator (Parent Operator)와 거의 유사한 동작을 하기 때문에, 상속을 통해 새로운 Operator(Child Operator)를 만들기로 결정했다. 새로 Child Operator는 다음 두 가지가 Parent Operator와 다르다.

  1. Parent Operator의 Instance 생성시 반드시 필요한 Parameter 중 일부가 Child Operator에서는 필요 없다.
  2. 가장 바깥에서 호출되는 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!

 

결론

  1. super().__init__()에서 기존 Parent를 선언하는데 반드시 필요했던 parameter for_what에 ""를 집어넣었다.
    • 이게 효과적인 방법일지는 의문 - Python 자체에 class 상속후, 필수 parameter를 변경하는 방법은 없는 듯 하다
  2. "CHILD IS OVERRIDER!"가 출력됐다는 뜻은, execute에서 사용하는 _internal_method()가 override된 Child의 Method를 사용했다는 뜻이다.

 

+ Recent posts