Tôi chỉ muốn giải quyết một số nhầm lẫn trước tiên. __file__
không phải là ký tự đại diện mà là thuộc tính. Các thuộc tính và phương thức gạch dưới kép được coi là "đặc biệt" theo quy ước và phục vụ một mục đích đặc biệt.
http://docs.python.org/reference/datamodel.html hiển thị nhiều phương pháp và thuộc tính đặc biệt, nếu không phải tất cả chúng.
Trong trường hợp này __file__
là thuộc tính của mô-đun (đối tượng mô-đun). Trong Python, tệp .py
là một mô-đun. Vì vậy, import amodule
sẽ có một thuộc tính là __file__
có nghĩa là những thứ khác nhau trong các trường hợp khác nhau.
Taken từ các tài liệu:
__file__
là tên đường dẫn của tập tin mà từ đó các mô-đun đã được nạp, nếu nó đã được nạp từ một tập tin. Thuộc tính __file__
không có mặt cho các mô-đun C được liên kết tĩnh vào trình thông dịch; cho mô-đun tiện ích được tải động từ thư viện được chia sẻ, đó là tên đường dẫn của tệp thư viện được chia sẻ.
Trong trường hợp của bạn, mô-đun đang truy cập thuộc tính riêng của nó trong không gian tên chung.
Để thấy điều này trong hành động thử:
# file: test.py
print globals()
print __file__
Và chạy:
python test.py
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py
Nguồn
2012-02-14 04:16:32
Rõ ràng, nó không phải là một ký tự đại diện. – tripleee
Biến "ma thuật" của nó; ký tự đại diện có nghĩa là một cái gì đó khá khác nhau. –