Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

동산로의 블로그

python overriding 본문

카테고리 없음

python overriding

동산로 2025. 4. 22. 11:12

오버라이딩은 객체지향 프로그래밍(OOP, Object-Oriented Programming)의 개념 중 하나입니다. 자식 클래스(child class, subclass)가 부모 클래스(parent class, superclass)의 메소드를 덮어쓰는 것 입니다.

부모 클래스의 메소드와 같은 이름, 시그니처(이름, 매개변수, 리턴 타입)를 가진 메소드를 새로 정의하는 것을 뜻 합니다. 상속 받은 성질을 알맞게 수정하거나 확장할 때에 사용합니다.

class Animal:
    def speak(self):
        return "Some sound"

class Dog(Animal):
    def speak(self):  # This overrides Animal.speak
        return "Woof"

a = Animal()
d = Dog()
print(a.speak())  # Some sound
print(d.speak())  # Woof

C++ 혹은 Java에서는 엄격하게 오버라이딩이 된다고 선언을 해주고 컴파일 단계에서 검사합니다. 파이썬의 덕타이핑과 유연한 성질 때문에 파이썬에서는 그런 필요가 없습니다.

하지만 이는 단점이 될 때도 있습니다.

부모 메소드가 run()이고 자식 메소드에서 실수로 runn()으로 작성 했을 때에 아무 문제 없이 작동합니다. 새로운 메소드로 인식하기 때문입니다. 자식 메소드를 봤을 때에 이것이 오버라이딩 된 것인가 아닌가 헷갈리게 합니다.

@override

파이선 3.12부터는 파이선 typing 라이브러리에 override라는 데코레이터(decorator)가 추가되었습니다. 이는 코드의 가독성을 높히고 오류를 방지할 뿐만 아니라 실질적인 기능도 있습니다. 

 

원래 파이썬에서 오버라이딩을 하면 완전 새로운 메소드가 되기 때문에 docstring이 사라집니다. @override 데코레이터를 사용하면 자식 메소드에서 정의하지 않는 경우 docstring을 그대로 가져옵니다.

from typing import override

class Animal:
    def speak(self) -> str:
        return "Some sound"

class Dog(Animal):
    @override
    def speak(self) -> str:
        return "Woof"

    # @override
    # def speek(self) -> str:  # This will raise an error because "speek" doesn't exist in Animal
    #

 

 

overrides module

파이선 3.12 이전 버전을 쓰고 있다면 overrides라는 모듈로 @override를 사용할 수 있다.

다만 이 경우에는 parent의 signature도 같이 구현하도록 강제한다.

 

EnforceOverrides 를 사용하면 모든 오버라이딩에 @override 데코레이터 사용을 강제할 수 있다.

 

  

from overrides import EnforceOverrides

from overrides import overrides