[Python] __getattr__, __gatattribute__ 의 차이

김지환·2023년 2월 18일
0

Python magic method

목록 보기
1/1

TL:DR;

객체의 멤버변수에 참조하려고 할 때 내부적으로 어떻게 동작하는지 알아보자.

getattr, getattribute

class Person:
    age = 30
    job = "의사"
    phone_number = "01011114444"

    def __init__(self, age: int, job: str, phone_number: str):
        self.age = age
        self.job = job
        self.phone_number = phone_number

    def __getattr__(self, item):
        print(f"정의된 변수가 없음. {item}")
        setattr(self, item, 0)
        return None

    def __getattribute__(self, item):
        print("내부에 있는가?")
        return super().__getattribute__(item)

    def __repr__(self):
        return f"나이: {self.age}, 직업: {self.job}, 전화번호: {self.phone_number}"


if __name__ == "__main__":
    person = Person(30, "개발자", "01022223333")
    print(person.age)
    print(person.ggg)
    print(person.ggg)
    print(person)

---
내부에 있는가?
30
내부에 있는가?
정의된 변수가 없음. ggg
None
내부에 있는가?
0
내부에 있는가?
내부에 있는가?
내부에 있는가?
나이: 30, 직업: 개발자, 전화번호: 01022223333

객체에 대해서 변수에 접근하게 될 때는 무조건 attribute 매서드를 거치게 된다. 외부에서 접근할 때 뿐 아니라 내부적으로 self.멤버변수 로 접근하게 될 때도 attribute 매소드를 거치게 된다.

여기서 주의할 점은 attribute 매서드 내에서 멤버변수를 호출하거나 하면 무한 루프에 빠져서 문제가 될 수 있으니 조심해야한다.

getattr 매서드는 getattribute를 통해서 변수를 찾을 수 없을 때 실행되게 된다.

따라서 무언가 정의되지 않은 변수에 대한 접근을 처리하고 싶을 때 getattr 매서드에서 값을 처리해주면 된다.

Reference

https://alphahackerhan.tistory.com/44#:~:text=__getattr__%20%EB%A9%94%EC%86%8C%EB%93%9C%EB%8A%94,%EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC%20%EC%9D%B4%EC%9A%A9%ED%95%98%EB%A9%B4%20%EB%90%9C%EB%8B%A4.

profile
Developer

0개의 댓글