모든 파이썬 클래스는 커스텀 getattr() 및 dir() 메서드를 정의해 객체의 동적 속성 접근을 커스터마이징할 수 있습니다. getattr() 함수는 주어진 속성 이름이 존재하지 않을 때 호출되고 누락된 속성 룩업을 찾아 즉시 값은 만듭니다. dir() 메서드는 객체가 dir() 함수에 전달될 때 호출되며 객체 속성 이름의 목록을 반환합니다.
파이썬 3.7부터 getattr() 및 dir() 함수는 모듈 레벨에서 정의할 수 있습니다. 즉, torch.nn 모듈을 상속받아 만든, pyTorch 모델들은 torch.nn 모듈 안의 _ getattr__() 함수를 호출하게 됩니다.
def __getattr__(self, name: str) -> Union[Tensor, 'Module']:
if '_parameters' in self.__dict__:
_parameters = self.__dict__['_parameters']
if name in _parameters:
return _parameters[name]
if '_buffers' in self.__dict__:
_buffers = self.__dict__['_buffers']
if name in _buffers:
return _buffers[name]
if '_modules' in self.__dict__:
modules = self.__dict__['_modules']
if name in modules:
return modules[name]
raise AttributeError("'{}' object has no attribute '{}'".format(
type(self).__name__, name))
실제 python 3.8 버전의 pyTorch 모듈 패키지를 확인해보니, 다음과 같이 정의되어, 인스턴스에 존재하지 않는 속성의 경우 다음과 같이 찾아서 반환하게 됩니다.