2010-10-13 30 views
8

Có thể quá tải câu lệnh từ/nhập bằng Python không?Có thể quá tải từ/nhập bằng Python không?

Ví dụ, giả sử jvm_object là một thể hiện của lớp JVM, là nó có thể viết mã này:

class JVM(object): 

    def import_func(self, cls): 
    return something... 

jvm = JVM() 

# would invoke JVM.import_func 
from jvm import Foo 
+3

Tại sao? bạn đã bao giờ làm điều này? –

+0

@ S.Lott Về cơ bản, tôi muốn nhập các gói và các lớp từ một JVM từ xa (trong một chương trình Python) và mặc dù tôi có thể cung cấp một phương thức nhập khẩu, tôi muốn sử dụng lại cú pháp Python. – Barthelemy

+0

"các gói và lớp nhập từ một JVM từ xa"? Không phải là một tập tin? Làm thế nào mà sẽ làm việc? Bạn sẽ quản lý việc tạo tệp .pyc như thế nào? Có gì sai với "tập tin"? Chúng hoạt động rất tốt. Có gì sai khi lắp hệ thống tập tin từ xa? Điều đó hoạt động thực sự tốt. –

Trả lời

7

This post chứng minh làm thế nào để sử dụng chức năng giới thiệu trong PEP-302 nhập module trên web. Tôi đăng nó như là một ví dụ về cách tùy chỉnh câu lệnh nhập khẩu hơn là cách sử dụng được đề xuất;)

+0

Cảm ơn, nó hoạt động tốt! – Barthelemy

3

Thật khó để tìm được thứ gì đó không thể bằng ngôn ngữ động như Python, nhưng chúng ta có thực sự cần lạm dụng mọi thứ không? Dù sao, ở đây là:

from types import ModuleType 
import sys 

class JVM(ModuleType): 
    Foo = 3 

sys.modules['JVM'] = JVM 

from JVM import Foo 
print Foo 

Nhưng một mô hình tôi đã nhìn thấy trong một số thư viện/dự án là một số loại của một hàm _make_module(), mà tạo ra một ModuleType động và khởi tất cả mọi thứ trong đó. Sau đó, Mô-đun hiện tại được thay thế bằng mô đun mới (sử dụng nhiệm vụ đến sys.modules) và chức năng _make_module() sẽ bị xóa. Lợi thế của điều đó, là bạn có thể lặp qua mô-đun và thậm chí thêm các đối tượng vào mô-đun bên trong vòng lặp đó, điều này khá hữu ích đôi khi (nhưng sử dụng nó một cách thận trọng!).

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