Как получить путь к файлу текущего класса если метод получения пути находится в родительском классе в другом файле?
Например, представим такую ситуацию:
# module1.py ###
class BaseCls:
@classmethod
def get_path(cls):
print(__file__)
# module2.py ###
from module1 import BaseCls
class MainCls(BaseCls):
pass
Что покажет код:
import module2
module2.MainCls.get_path()
Мы ожидаем что путь будет к файлу module2.py, но переменная __file__ объявлена внутри файла module1.py и поэтому будет указывать именно на него.
Чтобы получить правильный путь нам следует:
▫️ получить имя модуля текущего класса
module_name = module2.MainCls.__module__
▫️ найти этот модуль в списке импортированных модулей
mod = sys.modules[module_name]
▫️ получить значение переменной __file__
filepath = mod.
__file__
Вся эта процедура, причём для любого типа объекта, есть в функции inspect.getfile(). Так что наш метод должен выглядеть так:
# module1.py
import inspect
class BaseCls:
@classmethod
def get_path(cls):
print(inspect.getfile(cls))
Теперь из вызов этого метода из класса MainCls найдёт путь к файлу module2.py
#tricks