2016-12-29 4 views
1

여기는 내 첫 번째 질문이며 Python의 첫 번째 프로젝트입니다. __getattribute__가 다음과 같이 실패하는 이유는 무엇입니까? TypeError : 'NoneType'개체를 호출 할 수 없습니다.

나는 Ip500Device라는 클래스의 인스턴스를 저장하기 위해 노력하고있어 :

class Ip500Device(object): 

    list = [] 
    def __init__(self, shortMac, mac, status, deviceType): 
     self.__shortMac =shortMac 
     self.__mac=mac 
     self.__status=status 
     self.__deviceType=deviceType 
     self.__nbOfObjects=0 
     Ip500Device.list.append(self)  

    def __getattribute__(self, att): 
     if att=='hello': 
      return 0 

이 첫 번째 테스트는 단지 인 '안녕하세요',하지만 난 모든 속성을 얻으려면 그 후. 타 클래스에서

, 나는 장치 개체를 생성하고 목록에 추가 해요 :

self.__ip500DevicesLst.append(Ip500Device.Ip500Device(lst[0],lst[1],lst[2],lst[3])) 
for abcd in self.__ip500DevicesLst: 
     print abcd.__getattribute__('hello') 

하지만 인쇄하려고하면 프로그램이 메시지 반환

TypeError: 'NoneType' object is not callable 

I을 파이썬에서 클래스 인스턴스를 저장하는 법을 잘 이해하지 못한다.

+3

'__ip500DevicesLst'가 무엇인지 추측해야합니다. –

+1

OP는 매우 깔끔하게 '__ip500DevicesLst'가 목록임을 나타냅니다. 그러나 이것은''__getattribute__'를 호출하면 오류가 발생하는 이유와 관련이 없습니다. OP가 이에 대한 충분한 정보를 제공 했으므로 질문을 다시해야한다고 생각합니다. – ekhumoro

+0

목록에있는 항목 중 하나와 비슷하게 보이는 것은 '없음'입니다. 목록에 추가 된 것으로 표시된 메소드 호출에서 왔는지 또는 이미 '없음'이 포함되어 있는지 확실하지 않습니다. 어느 쪽이든, 목록 내용이 예상대로 작동하는지 확인하십시오. – Basic

답변

0

모두 속성에 대해 __getattribute__이 호출되어 "hello"이외의 모든 항목에 대해 None을 반환하도록 정의했기 때문에 오류가 발생합니다. __getattribute__은 그 자체로 속성이기 때문에 호출하려고하면 TypeError이 표시됩니다.

이 문제는 처리되지 않은 속성에 대한 기본 클래스 메서드 호출하여 고정 할 수 있습니다

>>> class Ip500Device(object): 
...  def __getattribute__(self, att): 
...   print('getattribute: %r' % att) 
...   if att == 'hello': 
...    return 0 
...   return super(Ip500Device, self).__getattribute__(att) 
... 
>>> abcd = Ip500Device() 
>>> abcd.__getattribute__('hello') 
getattribute: '__getattribute__' 
getattribute: 'hello' 
0 

그러나, 그에만 이미 존재하지 않는 속성을 요구하기 때문에, __getattr__을 정의하는 것이 좋습니다를 :

>>> class Ip500Device(object): 
...  def __getattr__(self, att): 
...   print('getattr: %r' % att) 
...   if att == 'hello': 
...    return 0 
...   raise AttributeError(att) 
... 
>>> abcd = Ip500Device() 
>>> abcd.hello 
getattr: 'hello' 
0 
>>> abcd.foo = 10 
>>> abcd.foo 
10 

마지막으로, 당신이 원하는 모든 이름으로 액세스 속성 인 경우, 사용할 수 있습니다 내장 getattr 기능 :

>>> class Ip500Device(object): pass 
... 
>>> abcd = Ip500Device() 
>>> abcd.foo = 10 
>>> getattr(abcd, 'foo') 
10 
1
print abcd.__getattribute__('hello') 

abcd.__getattribute____getattribute__ 방법이 아니다. 당신이 abcd.__getattribute__을 평가하려고 할 때, 당신은 실제로 당신이 그때는 방법 인 것처럼 전화를하려고 None을 반환

type(abcd).__getattribute__(abcd, '__getattribute__') 

를 호출하고 있습니다.