2011-01-19 7 views
0

다음은 다음과 같습니다.파이썬 __getattr__ 동작? ECLIPSE/PyDev 콘솔에서?

class A(object): 
    def __getattr__(self, attr): 
     try: 
      return self.__dict__[attr] 
     except KeyError: 
      self.__dict__[attr] = 'Attribute set to string' 
      print 'Assigned attribute' 
      return self.__dict__[attr] 

는 다음을 반환합니다.

obj = A() 
obj.foo 
Assigned attribute 
Assigned attribute 
Assigned attribute 
'Attribute set to string' 

마술은 어디에서 발생합니까?

(2.6.6에 있습니다.)

편집 : 의견을 보내 주셔서 감사합니다. 실제로이 문제는 Python 명령 줄 자체에서 재현 할 수 없습니다. Eclipse/PyDev에서 콘솔을 사용할 때만 발생하는 것 같습니다.

+4

를, 그것은 단지'한 번 attribute'을 할당 인쇄합니다. –

+2

파이썬 2.5, 2.6 또는 3.1에서는 이것을 재현 할 수 없습니다. def \ _ \ _ getattr \ _ \ _ 라인 다음에 ', attr "을 찾는"print "를 시도하여 원하는 것을보십시오. –

+0

이것은 이상합니다. 이클립스 콘솔에서 세 번 출력했지만 명령 쉘에서 인터프리터를 사용하면 제대로 동작한다. –

답변

1

발생하지 않는 :

class A(object): 
    def __getattr__(self, attr): 
     try: 
      return self.__dict__[attr] 
     except KeyError: 
      self.__dict__[attr] = 'Attribute set to string' 
      print 'Assigned attribute' 
      return self.__dict__[attr] 

obj = A() 
print obj.foo 

이 제공 :

Assigned attribute 
Attribute set to string 

__getattr__에만 속성이 존재하지 않는 경우라고합니다! 그래서 try .. except이 ... 때마다 제외에 그것은 동등의

갈 것입니다 : 나를 위해

class A(object): 
    def __getattr__(self, attr): 
     val = 'Attribute set to string' 
     setattr(self, attr, val) 
     print 'Assigned attribute' 
     return val 
3

코드와 약간 다른 버전이 있습니다.

class A(object): 
    def __getattr__(self, attr): 
     try: 
      return self.__dict__[attr] 
     except KeyError: 
      self.__dict__[attr] = 'Attribute set to string' 
      print 'Assigned attribute', attr 
      return self.__dict__[attr] 

>>> o = A() 
>>> o.foo 
Assigned attribute foo 
'Attribute set to string' 

어떻게 "할당 된 속성"이 두 번 이상 표시되는지 알 수 없습니다. 이것은 Python 2.6.6에서 발생합니다.

__getattr__을 호출하면 try이 항상 실패합니다.

관련 문제