객체의 멤버변수에 참조하려고 할 때 내부적으로 어떻게 동작하는지 알아보자.
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 매서드에서 값을 처리해주면 된다.