Я просто хочу спочатку вирішити певну плутанину. __file__це не майна, це атрибут. Подвійні атрибути підкреслення і умовні умови вважаються "особливими" умовно і служать спеціальній меті.
http://docs.python.org/reference/datamodel.html показує багато спеціальних методів та атрибутів, якщо не всі.
У цьому випадку __file__- атрибут модуля (об'єкт модуля). У Python .pyфайл є модулем. Так import amoduleбуде мати атрибут, __file__який означає різні речі за різницьких обставин.
Взяті з документів:
__file__- це ім'я файлу, з якого був завантажений модуль, якщо він завантажений з файлу. __file__Атрибут відсутня для модулів C, які статично пов'язані в інтерпретатор; для модулів розширень, що динамічно завантажуються із спільної бібліотеки, це ім'я файлу файлу спільної бібліотеки.
У вашому випадку модуль отримує доступ до власного __file__атрибуту у глобальному просторі імен.
Щоб побачити це в дії, спробуйте:
# file: test.py
print globals()
print __file__
І біжіть:
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py
__file__НЕ визначається у всіх випадках, наприклад, статично пов'язані модулі С. Ми не можемо розраховувати, що__file__завжди будуть доступні.