2010-10-09 21 views
7

Tôi chỉ "nghĩ" Tôi hiểu cách nhập và mô-đun hoạt động nhưng rõ ràng là tôi cần học thêm.Cách nhập công trình. Tại sao các mô-đun được nhập không kế thừa các mô-đun đã nhập khác

Dưới đây là một chương trình ví dụ (chỉ là một trường hợp thử nghiệm của somerthing tôi đang làm đó là lớn hơn nhiều trong phạm vi và quy mô) và một mô-đun:

quick.py

import gtk 
from quick_window import * 

w.show_all() 
gtk.main() 

quick_window.py

w = gtk.Window() 
w.connect('destroy', lambda w: gtk.main_quit()) 
l=gtk.Label('Hello') 
w.add(l) 

chạy tôi nhận được

$ python quick.py 
Traceback (most recent call last): 
    File "quick.py", line 2, in <module> 
    from quick_window import * 
    File "/home/woodnt/Dropbox/python/weather_project/plugins/quick_window.py", line 3, in <module> 
    w = gtk.Window() 
NameError: name 'gtk' is not defined 

Để có được nó để làm việc, tôi còn phải nhập khẩu (er, tái nhập khẩu) gtk trong module như vậy:

import gtk 

w = gtk.Window() 
w.connect('destroy', lambda w: gtk.main_quit()) 
l=gtk.Label('Hello') 
w.add(l) 

Tại sao tôi nên phải nhập khẩu gtk nhiều hơn một lần? Điều đó có nghĩa là tôi có 2 "gtk" trong bộ nhớ?

Tôi có phải nhập mọi thứ trong mỗi mô-đun mà tôi cần trong mô-đun đó không?

Tôi biết từng mô-đun có không gian tên riêng của nó, nhưng tôi nghĩ nó cũng được thừa hưởng "tổng số" bao gồm mô đun được nhập từ chương trình gọi.

Tôi đã bị ấn tượng bởi việc nhập mô-đun * giống như cắt và dán mã ngay vào vị trí đó. Có cách nào khác để làm điều đó không?

Trợ giúp được đánh giá cao.

Narnie

+0

Ít nhất vì bạn không phải viết mô-đun theo giả định rằng mô-đun nhập cũng đã nhập một mô-đun cụ thể. – delnan

Trả lời

13

Chi tiết nhập rất phức tạp, nhưng về mặt khái niệm thì rất đơn giản.

Khi bạn viết:

import some_module 

Nó tương đương với điều này:

some_module = import_module("some_module") 

nơi import_module là loại thích:

def import_module(modname): 
    if modname in sys.modules: 
     module = sys.modules[modname] 
    else: 
     filename = find_file_for_module(modname) 
     python_code = open(filename).read() 
     module = create_module_from_code(python_code) 
     sys.modules[modname] = module 
    return module 

Hai điều cần lưu ý ở đây: sự phân công của some_module là cụ thể: một câu lệnh import thực sự không làm gì trong module hiện tại ngoại trừ gán một module obje ct đến tên bạn chỉ định.Đó là lý do tại sao bạn không tự động lấy tên từ mô-đun đã nhập và tại sao nó không giống như sao chép mã đã nhập vào mô-đun hiện tại.

Ngoài ra, trong hàm import_module giả, nếu tên đã được nhập ở đâu đó, nó sẽ nằm trong danh sách toàn cầu của tất cả các mô-đun (sys.modules), và do đó sẽ đơn giản được sử dụng lại. Tệp sẽ không được mở lại, nó sẽ không được thực thi nữa, các hình cầu trong các mô-đun đó sẽ không nhận lại các giá trị mới, v.v. Nhập khẩu cùng một mô-đun vào nhiều nơi không phải là lãng phí hoặc làm việc thêm, nó là rất nhanh.

+1

Đỉnh "dưới mui xe" này giúp tôi hiểu rõ hơn những gì đang diễn ra. Cảm ơn. – narnie

+0

cảm ơn bạn @Ned Batchelder, hôm nay bạn đã giúp tôi. –

6

nhập khẩu là cần thiết để mang lại các nội dung của file py vào không gian tên của module đó - nếu bạn không nhập khẩu, các tên trong nó không thể được tham chiếu.

Một số thông tin thêm: http://effbot.org/zone/import-confusion.htm

Khi Python nhập khẩu một mô-đun, nó đầu tiên kiểm tra các mô-đun registry (sys.modules) để xem nếu module được đã nhập khẩu. Nếu đúng như vậy, Python sử dụng đối tượng mô-đun hiện tại .

+0

Lưu ý đặc biệt rằng bất kể bạn nhập mô-đun bao nhiêu lần, mã phạm vi bên ngoài trong mô-đun đã nhập chỉ chạy một lần (bỏ chặn và tải lại, tất nhiên). OP sẽ không có 2 'gtk trong bộ nhớ. Hiệu quả của việc nhập khẩu tiếp theo chỉ là đưa mọi thứ vào không gian tên cục bộ. –

+0

Cảm ơn bạn đã làm rõ điều này. Dường như có rất nhiều công việc "thêm" và một chút lãng phí để làm điều này, nhưng nếu đó là cách thức của nó, đó là cách nó. Cảm ơn các liên kết. Tôi mới bắt đầu đọc nó và tôi nghĩ đó chính là điều tôi cần suy nghĩ tốt hơn trong python. – narnie

Các vấn đề liên quan