Я думаю, проблема в том, что вам нужен экземпляр вашего класса. Эти методы являются методами экземпляра.
Я добавил ведение журнала для упрощения отладки. Я получаю вывод в консоли ipython
, когда я example.something
или example.<tab>
.
- Python версия 3.8.2
- I Python версия 7.14.0
Это мое наблюдение: вызывается <tab>
__dir__
и возвращенная коллекция предметов отображается в консоли I Python. Если элемент, выбранный после <tab>
, не является атрибутом объекта, то __getattr__
вызывается в попытке найти его.
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
class Example:
def __init__(self):
logging.info("init")
self._attrs = ("foo", "bar", "baz")
for attr in self._attrs:
setattr(self, attr, attr)
def __getattr__(self, attr):
logging.info(f"__getattr__ called: {attr}")
def __dir__(self):
logging.info("__dir__ called")
return ("extra", *self._attrs)
# Create an instance of Example.
# The instance methods can then be called on the instance.
example = Example()
if __name__ == "__main__":
logging.info(example)