Например, представим такую ситуацию:
# 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