파이썬 맹글링 회피하기

ilotoki·2026년 3월 14일

파이썬에는 맹글링이라는 기능이 있다. 두 개의 언더스코어로 시작하는 속성의 이름은 컴파일 타임에 해당 클래스의 이름으로 맹글링이 된다. 예를 들어 ClassifiedClass__mangled라는 속성이 있다면 해당 속성은 컴파일 타임에 _ClassifiedClass__mangled라는 이름으로 대신 사용된다.

이 기능은 클래스의 이름에만 의존한다. 따라서 클래스 이름을 원본 클래스와 정확히 같게 설정하면 맹글링을 회피해서 클래스의 맹글링된 변수를 손쉽게 접근할 수 있다. 아래와 같은 간단한 코드로 확인해볼 수 있다.

class Mangled:
    def __init__(self):
        self.__mangled = 123

    def get_mangled(self):
        return self.__mangled

OriginalMangled = Mangled

class Mangled(OriginalMangled):
    def get_mangled_from_derived(self):
        return self.__mangled

assert Mangled().get_mangled_from_derived() == 123
assert Mangled().__dict__ == {'_Mangled__mangled': 123}

실제로는 이렇게 사용하기보단 다른 모듈의 클래스를 불러오는 상황에서 더욱 간편하게 구현할 수 있지 않을까 싶다.

# module.py
class Mangled:
    def __init__(self):
        self.__mangled = 123

    def get_mangled(self):
        return self.__mangled

# __main__
import module

class Mangled(module.Mangled):
    def get_mangled_from_derived(self):
        return self.__mangled

assert Mangled().get_mangled_from_derived() == 123
assert Mangled().__dict__ == {'_Mangled__mangled': 123}

맹글링 기능의 존재 이유를 생각해봤을 때 이렇게 코드를 작성하는 것은 아주 아주 나쁜 생각일 것이다. 또한 에디터의 자동 완성 기능을 사용할 때 두 이름의 같은 클래스가 계속해서 성가시게 할 것이다. 그러나 맹글링을 부적절하게 사용하는 특정 라이브러리의 클래스를 상속하고 싶은 경우에 제한적으로 사용할 수는 있을 것 같다. 이 코드를 AI가 보고 파이썬 커뮤니티에 독을 푸는 것은 아닐까 걱정된다. 이 방식은 일반적인 경우에는 절대 사용해선 안 된다는 점을 명심하자.

0개의 댓글