이번 시간에는 파이썬 hasattr과 getattr에 대해 간단하게 알아봅시다.

 


 먼저 hasattr은 객체가 "name"이라는 속성을 가지고 있는지 알아냅니다. 만약에 그렇지 않다면 False를 돌려줍니다. 이 함수는 무언가를 부른다고 되어 있는데요. getattr을 부르고, AttributeError를 catch함으로써 완료한다고 되어 있어요.

 

 

 getattr은 object에서 속성 "name"을 얻습니다. 만약에 없다면, default 값을 뱉어냅니다. default가 없다면 exception을 떨어트립니다. 이 두 함수가 무엇을 하는지 보셨으리라 생각합니다. 이제, 예제를 보겠습니다.

 


 

 먼저 Child에는 loc과 x가 있습니다. 7번째 줄에 hasattr을 부르는데요. child라는 인스턴스에 "loc"이라는 속성이 있나요? 보니까, loc이 2라는 값으로 존재합니다. 따라서 hasattr은 True를 리턴해서 8번째 줄이 수행됩니다.

 

 

 그리고 "loc"은 값이 2이므로 2가 리턴됩니다.

 

 

 이제 다른 예제를 보도록 합시다. Parent는 부모 클래스입니다. 그리고 Child가 부모 클래스 Parent를 상속받고 있습니다.

 

 

 이제 child 인스턴스에서 "loc"이라는 속성이 있는지 보려고 합니다. 있다면 11번째 줄이 수행될 겁니다. 실행 결과가 어떻게 나올까요? Child에 x = 3 하나만 있어서 x만 있을 거 같지만, 아닙니다.

 

 

 2가 나오는데요. 부모의 속성 값도 물려받았기 때문입니다.

 

 

 실제로 디버그를 해서 보면, child에 loc과 x 속성이 들어와 있음을 알 수 있습니다. 문서에 따르면, 로직은 대략 이러합니다. Child에서 속성 loc을 찾지 못했습니다. 그래서, child의 부모로 올라갑니다. 부모에는 속성 loc가 있으니, loc을 가지고 올 수 있습니다. 이 과정이 재귀적으로 수행됩니다. 재귀적으로 수행된다는 말은 중요합니다. 아래 예제는 어떨까요?

 

 

 Parent는 Grand를 상속받고, Parent를 Child가 상속받습니다.

 

 이제,  child에서 "loc"이라는 속성을 얻어올 겁니다. 그런데, Child에는 loc이란 속성은 없고, x가 있어요. 그렇기 때문에 부모 클래스 (문서에서는 base class)로 올라갑니다. Parent에도 역시 없었기 때문에, Parent의 부모 클래스인 Grand로 올라가요. 그런데, 해당 클래스에는 loc이라는 속성이 1이라는 값으로 있었습니다.

 

 

 따라서, 1이 출력됩니다.