Этот вопрос должен быть больше о __dir__
, чем о numpy
.Правильный способ переопределить метод __dir__ в python
У меня есть подкласс numpy.recarray
(в Python 2.7, Numpy 1.6.2), и я заметил recarray
«s имена полей не отображаются, когда dir
ИНГ объект (и, следовательно, IPython в автозаполнения не работает).
Попытка исправить это, я попытался перекрывая __dir__
в моем подклассе, например:
def __dir__(self):
return sorted(set(
super(MyRecArray, self).__dir__() + \
self.__dict__.keys() + self.dtype.fields.keys()))
в результате которого с: AttributeError: 'super' object has no attribute '__dir__'
. (я нашел here это должно реально работать в питона 3.3 ...)
В качестве обходного пути, я попробовал:
def __dir__(self):
return sorted(set(
dir(type(self)) + \
self.__dict__.keys() + self.dtype.fields.keys()))
Насколько я могу судить, это работает, но, конечно, не как изящно.
Вопросы:
- Является ли последнее решение правильно в моем случае, то есть для подкласса
recarray
? - Есть ли способ заставить его работать в общем случае? Мне кажется, что это не сработает с множественным наследованием (разрывая цепочку
super
), и, конечно же, для объектов без__dict__
... - Вы знаете, почему
recarray
не поддерживает перечисление имен своих полей, чтобы начать с? простой надзор?
Я попытался подкласс 'recarray' и' dir' ** делает ** показать 'recarray' атрибуты. Можете ли вы объяснить, что, по-вашему, отсутствует? – Bakuriu
'self.dtype.fields.keys()' – shx2