1. Namespace là gì?

Namespace là hệ thống có một tên duy nhất cho 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(dictionary) trong Python. Hãy xem xét một ví dụ về một cấu trúc hệ thống file trong thư mục của các máy tính.

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

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

Trên các dòng code, 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ừ(tên) sẽ cung cấp thêm thông tin: Với 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à người ta đang cố truy cập vào một biến hoặc một phương thức.

2. Các loại namespace:

Khi trình thông dịch Python chạy độc lập 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 các namespace cục bộ.

3. 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ụ:


# var1 is in the global namespace  
var1 = 5
def some_func(): 
  
    # var2 is in the local namespace  
    var2 = 6
    def some_inner_func(): 
  
        # var3 is in the nested local  
        # namespace 
        var3 = 7

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ư 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 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 biến  toàn cục và cập nhật hoặc xử lý chúng.


# Python program processing 
# global variable 
  
count = 5
def some_method(): 
    global count 
    count = count + 1
    print(count) 
some_method() 

Kết quả:

6

4. 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 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:


# Python program showing 
# a scope of object 
  
def some_func(): 
    print("Inside some_func") 
    def some_inner_func(): 
        var = 10
        print("Inside inner function, value of var:",var) 
    some_inner_func() 
    print("Try printing var from outer function: ",var) 
some_func() 

Kết quả:

Inside some_func
Inside inner function, value of var: 10

Traceback (most recent call last):
  File "/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py", line 8, in 
    some_func()
  File "/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py", line 7, in some_func
    print("Try printing var from outer function: ",var)
NameError: name 'var' is not defined

Full series tự học Python từ cơ bản tới nâng cao tại đây nha.

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!