Это мой первый вопрос здесь, а также мой первый проект на Python.
Я пытаюсь сохранить экземпляры класса с именем 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
Я не очень хорошо понимаю, как хранить экземпляры классов в Python.
__ip500DevicesLst
. - person Peter Wood   schedule 29.12.2016__ip500DevicesLst
- это список. Однако это не относится к вопросу о том, почему вызов__getattribute__
вызывает ошибку. ОП предоставил достаточно информации для ответа на этот вопрос, поэтому я думаю, что вопрос следует открыть заново. - person ekhumoro   schedule 01.01.2017None
. Не уверен, что это происходит из-за вызова метода, который вы показали для добавления в список, или он уже содержитNone
. В любом случае попробуйте проверить, что содержимое списка соответствует ожиданиям. - person Basic   schedule 01.01.2017__getattribute__
вызывается безоговорочно, поэтому очень важно вызывать метод базового класса для необработанных атрибутов. Код OP этого не делает, поэтому он просто возвращаетNone
при попытке доступа к самому атрибуту__getattribute__
— отсюда и ошибка. - person ekhumoro   schedule 01.01.2017__getatribute__
- person Basic   schedule 01.01.2017__getattribute__
. Если вам просто нужен обработчик неопределенных имен, определите__getattr__
(который вызывается, только если имя не найдено), а не__getattribute__
(который вызывается безоговорочно). В любом случае вы хотите получить доступ какobj.hello
, а не явно вызывать специальный метод (что противоречит цели определения специального метода, который должен иметь специальный обработчик для поиска стандартного атрибута). Оба специальных метода должны подниматьAttributeError
, когда нет возвращаемого значения, а не молча, неявно возвращаяNone
. - person ShadowRanger   schedule 01.01.2017