Namespace và Phạm vi trong Python

632
  Namespace and Revealing Module Pattern trong Javascript
  Cấu trúc của một chương trình trong Python

Namespace là gì?

Namespace là một hệ thống có một tên duy nhất cho mỗi mọi đối tượng trong Python. Một đối tượng có thể là một biến hoặc một phương thức. Bản thân Python duy trì một namespace dưới dạng từ điển Python. Hãy xem xét một ví dụ về một cấu trúc hệ thống tệp tin thư mục trong các máy tính.

Như ta đã biết, có thể có nhiều thư mục có một tệp cùng tên bên trong mỗi thư mục. Nhưng người ta có thể dẫn đến tệp chỉ bằng cách chỉ định đường dẫn tuyệt đối đến tệp.

Ví dụ về thời gian thực, vai trò của một namespace giống như tên họ. Có thể không tìm thấy một tên “Alice” nào trong lớp nếu có rất nhiều “Alice”, nhưng khi bạn yêu cầu cụ thể về “Alice Lee” hay “Alice Clack” (với tên họ), thì lúc này chỉ có duy nhất một tên.

Trên các dòng tương tự, trình thông dịch Python hiểu chính xác biến hoặc phương thức nào đang cố được chỉ đến trong code, tùy thuộc vào namespace. Vì vậy, việc phân nhỏ các từ chính nó đã cung cấp thêm ít thông tin: Name của nó (có nghĩa là tên, một định danh duy nhất) + Space (thứ liên quan đến phạm vi). Ở đây, một name có thể là của bất kỳ phương thức hoặc biến nào trong Python và space phụ thuộc vào vị trí mà từ đó người ta đang cố truy cập vào một biến hoặc một phương thức.

Các loại namespace:

Khi trình thông dịch Python chỉ chạy mà không có các mô-đun, phương thức, và lớp do người dùng định nghĩa, v.v thì một số hàm như print(), id() luôn xuất hiện, chúng được triển khai trong các namespace. Khi người dùng tạo một mô-đun, một namespace toàn cục sẽ được khởi tạo, việc tạo các hàm cục bộ sau đó sẽ tạo ra namespace cục bộ. Namespace tích hợp sẵn bao gồm namespace toàn cục và namespace toàn cục bao gồm namespace cục bộ.

Thời gian tồn tại của một namespace:

Thời gian tồn tại của một namespace phụ thuộc vào phạm vi của các đối tượng, nếu phạm vi của một đối tượng kết thúc, thời gian tồn tại của namespace đó cũng kết thúc. Do đó, không thể truy cập các đối tượng bên trong namespace từ một namespace bên ngoài.

Ví dụ:

Như thể hiện trong hình dưới đây, một tên đối tượng có thể cùng xuất hiện trong nhiều namespace vì sự tách biệt giữa các namespace của chúng.

Nhưng trong một số trường hợp, người ta có thể chỉ quan tâm đến việc cập nhật hoặc xử lý biến toàn cục, như trong ví dụ sau, người ta đánh dấu nó rõ ràng toàn cục và cập nhật hoặc xử lý.

Kết quả:

Phạm vi của các đối tượng trong Python:

Phạm vi đề cập đến vùng code mà từ đó đối tượng cụ thể trong Python có thể truy cập được. Do đó, người ta không thể truy cập bất kỳ đối tượng cụ thể nào từ bất kỳ nơi nào trong code, việc truy cập phải được cho phép theo phạm vi của đối tượng.

Hãy lấy một ví dụ để hiểu sự giống nhau chi tiết hơn:

Ví dụ 1:

Kết quả:

Techtalk via Cafedev