Tôi tự hỏi liệu có thể tránh được một số nhược điểm của việc sử dụng biến toàn cục (xem ví dụ: http://wiki.c2.com/?GlobalVariablesAreBad ) bằng cách sử dụng không gian tên lớp thay vì không gian tên toàn cục / mô-đun để chuyển các giá trị của biến không . Đoạn mã sau chỉ ra rằng hai phương pháp về cơ bản giống hệt nhau. Có một lợi thế nhỏ trong việc sử dụng không gian tên lớp như được giải thích bên dưới.
Các đoạn mã sau đây cũng cho thấy rằng các thuộc tính hoặc biến có thể được tạo và xóa động trong cả không gian tên toàn cục / mô-đun và không gian tên lớp.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Tôi gọi mô-đun này là 'tường' vì nó được sử dụng để trả lại các biến khỏi. Nó sẽ hoạt động như một không gian để tạm thời xác định các biến toàn cục và các thuộc tính toàn lớp của 'bộ định tuyến' lớp trống.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Mô-đun này nhập tường và xác định một chức năng duy nhất sourcefn
định nghĩa một thông báo và phát ra nó bằng hai cơ chế khác nhau, một thông qua hình cầu và một qua chức năng bộ định tuyến. Lưu ý rằng các biến wall.msg
và wall.router.message
được định nghĩa ở đây lần đầu tiên trong không gian tên tương ứng của chúng.
dest.py
import wall
def destfn():
if hasattr(wall, 'msg'):
print 'global: ' + wall.msg
del wall.msg
else:
print 'global: ' + 'no message'
if hasattr(wall.router, 'msg'):
print 'router: ' + wall.router.msg
del wall.router.msg
else:
print 'router: ' + 'no message'
Mô-đun này xác định một chức năng destfn
sử dụng hai cơ chế khác nhau để nhận các thông báo do nguồn phát ra. Nó cho phép khả năng biến 'msg' có thể không tồn tại. destfn
cũng xóa các biến khi chúng đã được hiển thị.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Mô-đun này gọi các hàm được xác định trước đó theo trình tự. Sau lần gọi đầu tiên đến dest.destfn
các biến wall.msg
và wall.router.msg
không còn tồn tại.
Đầu ra từ chương trình là:
toàn cầu: Xin chào thế giới!
bộ định tuyến: Xin chào thế giới!
toàn cầu: không có
bộ định tuyến tin nhắn : không có tin nhắn
Các đoạn mã trên cho thấy mô-đun / toàn cục và cơ chế biến lớp / lớp về cơ bản giống hệt nhau.
Nếu nhiều biến được chia sẻ, ô nhiễm không gian tên có thể được quản lý bằng cách sử dụng một số mô-đun kiểu tường, ví dụ: wall1, wall2, v.v. hoặc bằng cách xác định một số lớp kiểu bộ định tuyến trong một tệp duy nhất. Cái thứ hai gọn gàng hơn một chút, vì vậy có lẽ đại diện cho một lợi thế biên khi sử dụng cơ chế biến lớp.