Page 70 - Python Simple
P. 70
9. Lớp http://www.vithon.org/tutorial/2.5/node11.html
A namespace (vùng tên) (vùng tên) là ánh xạ từ tên vào đối tượng. Đa số các vùng tên
được cài đặt bằng từ điển Python, nhưng điều đó thường là không quan trọng (trừ tốc
độ), và có thể sẽ thay đổi trong tương lai. Các ví dụ vùng tên như: tập hợp các tên có
sẵn (các hàm như abs(), và các tên biệt lệ có sẵn); các tên toàn cụ trong một
mô-đun; các tên nội bộ trong một phép gọi hàm. Theo nghĩa đó tập hợp các thuộc
tính của một đối tượng cũng là một vùng tên. Điều quan trọng cần biết về vùng tên là
tuyệt đối không có quan hệ gì giữa các vùng tên khác nhau; ví dụ hai mô-đun khác
nhau có thể cùng định nghĩa hàm ``maximize'' mà không sợ lẫn lộn -- người dùng
mô-đun phải thêm tiền tố tên mô-đun trước khi gọi hàm.
Cũng xin nói thêm là từ thuộc tính được dùng để chỉ mọi tên theo sau dấu chấm -- ví
dụ, trong biểu thức z.real, real là một thuộc tính của đối tượng z. Nói đúng ra, tham
chiếu tới tên trong một mô-đun là các tham chiếu tới thuộc tính: trong biểu thức
modname.funcname, modname là một đối tượng mô-đun và funcname là một thuộc tính
của nó. Trong trường hợp này, việc ánh xạ giữa các thuộc tính của mô-đun và các tên
toàn cục được định nghĩa trong mô-đun thật ra rất đơn giản: chúng dùng chung một
vùng tên! 9.1
Thuộc tính có thể là chỉ đọc, hoặc đọc ghi. Trong trường hợp sau, phép gán vào thuộc
tính có thể được thực hiện. Các thuộc tính mô-đun là đọc ghi: bạn có thể viết
"modname.the_answer = 42". Các thuộc tính đọc ghi cũng có thể được xóa đi với câu
lệnh del . Ví dụ, "del modname.the_answer" sẽ xóa thuộc tính the_answer từ đối
tượng tên modname.
Các vùng tên được tạo ra vào những lúc khác nhau và có thời gian sống khác nhau.
Vùng tên chứa các tên có sẵn được tạo ra khi trình thông dịch Python bắt đầu, và
không bao giờ bị xóa đi. Vùng tên toàn cục của một mô-đun được tạo ra khi định
nghĩa mô-đun được đọc; bình thường, vùng tên mô-đun cũng tồn tại cho tới khi trình
thông dịch thoát ra. Các câu lệnh được thực thi bởi lời gọi ở lớp cao nhất của trình
thông dịch, vì đọc từ một kịch bản hoặc qua tương tác, được coi như một phần của
mô-đun gọi là __main__, cho nên chúng cũng có vùng tên riêng. (Các tên có sẵn thật
ra cũng tồn tại trong một mô-đun; được gọi là __builtin__.)
Vùng tên nội bộ của một hàm được tạo ra khi hàm được gọi, và được xóa đi khi hàm
trả về, hoặc nâng một biệt lệ không được xử lý trong hàm. Dĩ nhiên, các lời gọi hàm
đệ quy có vùng tên riêng của chúng.
A phạm vi là một vùng văn bản của một chương trình Python mà một vùng tên có thể
được truy cập trực tiếp. ``Có thể truy cập trực tiếp'' có nghĩa là một tham chiếu không
đầy đủ (unqualifed reference) tới một tên sẽ thử tìm tên đó trong vùng tên.
Mặc dù phạm vi được xác định tĩnh, chúng được dùng một cách động. Vào bất kỳ một
lúc nào, có ít nhất ba phạm vi lồng nhau mà vùng tên của chúng có thể được truy cập
trực tiếp: phạm vi bên trong cùng, được tìm trước, chứa các tên nội bộ; các vùng tên
của các hàm chứa nó, được tìm bắt đầu từ phạm vi chứa nó gần nhất (nearest
enclosing scope); phạm vi giữa (middle scope), được tìm kế, chứa các tên toàn cục của
mô-đun; và phạm vi ngoài cùng (được tìm sau cùng) là vùng tên chứa các tên có sẵn.
Nếu một tên được khai báo là toàn cục, thì mọi tham chiếu hoặc phép gán sẽ đi thẳng
vào phạm vi giữa chứa các tên toàn cục của mô-đun. Nếu không, mọi biến được tìm
thấy ngoài phạm vi trong cùng chỉ có thể được đọc (nếu thử khi vào các biến đó sẽ tạo
một biến cục bộ mới trong phạm vi trong vùng, và không ảnh hưởng tới biến cùng tên
ở phạm vi ngoài).
2 of 13 08/31/2011 10:27 AM