Sử dụng phương thức inspect.getfile[]
để lấy filepath của một lớp, e. g. print[inspect.getfile[Employee]]
. Phương thức
>>> C.f.im_class0 lấy một đối tượng và trả về tên của tệp trong đó đối tượng được xác định
Ví dụ trên giả định rằng bạn có một lớp
>>> C.f.im_class1 trong một tệp có tên là
>>> C.f.im_class2 nằm trong cùng một thư mục
Phương thức trả về tên của tệp trong đó một đối tượng được xác định
Phương thức
>>> C.f.im_class0 ném ra một
>>> C.f.im_class4 nếu đối tượng là một mô-đun, lớp hoặc hàm tích hợp sẵn
Nếu bạn chỉ có quyền truy cập vào một thể hiện của lớp, hãy truy cập thuộc tính
>>> C.f.im_class5 của nó trong lệnh gọi phương thức
>>> C.f.im_class0
Bạn cũng có thể sử dụng lớp
>>> C.f.im_class7 để đạt được kết quả tương tự
Lớp trả về loại đối tượng
Thông thường, giá trị trả về giống như truy cập thuộc tính
>>> C.f.im_class5 trên đối tượng
Phương thức inspect.getfile[]
trả về đường dẫn tuyệt đối đến mô-đun trong đó lớp được xác định
Nếu bạn cần lấy một đường dẫn tương đối, hãy sử dụng phương thức print[inspect.getfile[Employee]]
2
Phương thức lấy một filepath và trả về một phiên bản tương đối của đường dẫn
Ngoài ra, bạn có thể sử dụng phương pháp print[inspect.getfile[Employee]]
3
Nhận đường dẫn tệp của một lớp bằng os. đường dẫn. dấu cách []
Để có được filepath của một lớp
- Sử dụng từ điển
print[inspect.getfile[Employee]]
4 để lấy mô-đun trong đó lớp được xác định - Sử dụng thuộc tính
print[inspect.getfile[Employee]]
5 để lấy tên đường dẫn của tệp mà mô-đun được tải từ đó - Sử dụng phương pháp
print[inspect.getfile[Employee]]
3 để có phiên bản chuẩn hóa, tuyệt đối của đường dẫn
Phương thức lấy một đường dẫn và trả về một phiên bản tuyệt đối, chuẩn hóa của đường dẫn
là một từ điển ánh xạ tên mô-đun tới các mô-đun đã được tải
Chúng tôi đã sử dụng thuộc tính print[inspect.getfile[Employee]]
7 trên lớp để lấy tên của mô-đun trong đó lớp được xác định
Thuộc tính print[inspect.getfile[Employee]]
5 trên mô-đun trả về tên đường dẫn của tệp mà mô-đun được tải từ đó
Các cơ sở nội quan của Python từ lâu đã hỗ trợ kém cho các lớp lồng nhau. Với một đối tượng lớp, không thể biết liệu nó được định nghĩa bên trong một lớp khác hay ở cấp cao nhất của mô-đun; . Mặc dù việc sử dụng các lớp lồng nhau thường được coi là phong cách kém, nhưng lý do duy nhất để chúng có hỗ trợ nội quan hạng hai là một cách chơi chữ tệ hại.
Python 3 thêm sự xúc phạm đến thương tích bằng cách loại bỏ những gì trước đây được gọi là phương thức không liên kết. Trong Python 2, đưa ra định nghĩa sau
class C: def f[]: pass
sau đó bạn có thể đi từ đối tượng
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']7 đến lớp định nghĩa của nó
>>> C.f.im_class
Khả năng này không còn trong Python 3
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Điều này lại giới hạn các khả năng xem xét nội tâm có sẵn cho người dùng. Nó có thể tạo ra các sự cố thực tế khi chuyển phần mềm sang Python 3, ví dụ như Twisted Core trong đó vấn đề về các đối tượng phương pháp hướng nội xuất hiện nhiều lần. Nó cũng hạn chế hỗ trợ tẩy
PEP này đề xuất bổ sung thuộc tính
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']8 cho các hàm và lớp. Đối với các hàm và lớp cấp cao nhất, thuộc tính
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']8 bằng với thuộc tính
>>> C.f.im_class0. Đối với các lớp, phương thức và hàm lồng nhau, thuộc tính
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']8 chứa một đường dẫn chấm dẫn đến đối tượng từ cấp cao nhất của mô-đun. Không gian tên cục bộ của một hàm được biểu diễn trong đường chấm chấm đó bởi một thành phần có tên là
>>> C.f.im_class0
repr[] và str[] của các hàm và lớp được sửa đổi để sử dụng
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']8 thay vì
>>> C.f.im_class0
>>> class C: .. def f[]: pass .. class D: .. def g[]: pass ... >>> C.__qualname__ 'C' >>> C.f.__qualname__ 'C.f' >>> C.D.__qualname__ 'C.D' >>> C.D.g.__qualname__ 'C.D.g'
>>> def f[]: .. def g[]: pass .. return g ... >>> f.__qualname__ 'f' >>> f[].__qualname__ 'f..g'
Với các hàm lồng nhau [và các lớp được xác định bên trong các hàm], đường chấm chấm sẽ không thể đi lại được theo chương trình vì không gian tên của hàm không có sẵn từ bên ngoài. Nó vẫn sẽ hữu ích hơn cho người đọc con người so với
>>> C.f.im_class0 trần trụi
Là thuộc tính
>>> C.f.im_class0, thuộc tính
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']8 được tính toán tĩnh và nó sẽ không tự động tuân theo rebinding
Vì
>>> C.f.im_class0,
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']8 không bao gồm tên mô-đun. Điều này làm cho nó độc lập với răng cưa và rebinding mô-đun, đồng thời cho phép tính toán nó tại thời điểm biên dịch
Việc khôi phục các phương thức không liên kết sẽ chỉ giải quyết được một phần vấn đề mà PEP này giải quyết, với mức giá cao hơn [một loại đối tượng bổ sung và một hướng dẫn bổ sung, thay vì một thuộc tính bổ sung]
“Tên đủ điều kiện” là cách gần đúng nhất, dưới dạng một cụm từ ngắn, về nội dung của thuộc tính bổ sung. Nó không phải là “tên đầy đủ” hoặc “tên đủ điều kiện” vì nó [cố ý] không bao gồm tên mô-đun. Gọi nó là “đường dẫn” sẽ có nguy cơ gây nhầm lẫn với đường dẫn hệ thống tệp và thuộc tính
>>> C.f.im_class8
Đề xuất đầu tiên cho tên thuộc tính là gọi nó là
>>> C.f.im_class9 nhưng nhiều người [những người không biết về việc sử dụng biệt ngữ như vậy trước đây trong e. g. đặc tả XML ] nhận thấy nó tối nghĩa và không rõ ràng, đó là lý do tại sao
>>> C.f.im_class Traceback [most recent call last]: File "", line 1, in AttributeError: 'function' object has no attribute 'im_class' >>> dir[C.f] ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']8 ít ngắn gọn hơn và rõ ràng hơn cuối cùng đã được chọn