Как отмечается в комментариях, obj
- это класс, а не экземпляр. Он содержит функцию __repr__
, которая будет привязана к экземпляру, как только вы его создадите.
Простое и элегантное решение этого вопроса - заменить функцию browse
классом с тем же именем. , Вызов класса создает экземпляр (если вы на самом деле не связываетесь с метаклассами или __new__
), поэтому интерфейс, который у вас сейчас есть, менять не нужно. Однако внутренне вы должны создавать экземпляр своего класса для каждого каталога, в который вы углубились.
Еще одна вещь, которая позволит вам это сделать, - это иметь действительно динамическое c решение. Прямо сейчас вы на самом деле вербуете всех детей вашего root. Это может быть очень дорого как по времени, так и по памяти. В идеале вам нужно только перечислить текущий каталог и указывать дочерние элементы только по запросу.
from os import listdir
from os.path import isdir, join
import re
class browse:
def __init__(self, path, directory=True):
# Create an attribute in __dict__ for each child
self.__path__ = path
if directory:
for file in listdir(path):
full = join(path, file)
key = re.sub(r'^(?=\d)|\W', '_', file)
setattr(self, key, full if isdir(full) else browse(full, False))
def __getattribute__(self, name):
if name == '__path__':
return super().__getattribute__(name)
d = super().__getattribute__('__dict__')
if name in d:
child = d[name]
if isinstance(child, str):
child = browse(child)
setattr(self, name, child)
return child
return super().__getattribute__(name)
def __repr__(self):
return self.__path__
def __str__(self):
return self.__path__
Это решение добавляет атрибут для каждой записи в пути root. Файлы записываются как browse
объекты, а каталоги записываются как строки. Переопределение __getattribute__
позволяет вам менять строки, которые вы запрашиваете, на полные browse
объекты на лету, вместо того, чтобы расширять все ваши папки заранее.
Возможное улучшение, учитывая предполагаемый вариант использования, будет быть удалить строку setattr(self, name, child)
. Таким образом, вы не будете сохранять ненужные ссылки на каталоги, которые вы случайно просматривали, например.