2011-11-09 36 views
5

Tôi có cấu trúc thư mục sau:Python - Năng động, lớp nhập khẩu

- MyProject 
    - App1 
     - some_module1.py 
     - some_module2.py 
    - App2 
     - some_other_module1.py 
     - some_other_module2.py 

Bên trong mỗi mô-đun (some_module1.py ví dụ) có một lớp học kéo dài từ một lớp cơ sở, trong trường hợp của tôi, Nhà sản xuất .

Điều tôi đang cố làm là tải động trong lớp này. Để làm điều đó, tôi có một danh sách các "ứng dụng được cài đặt" trông như thế này:

INSTALLED_APPS = (
    'App1', 
    'App2', 
) 

Tôi cố gắng để viết một chức năng mà sẽ kiểm tra từng "ứng dụng" gói cho một lớp sản xuất nói riêng và đảm bảo nó kéo dài từ lớp cơ sở sản xuất. Một cái gì đó như thế này:

module_class = 'some_module1.SomeClass' 

# Loop through each package in the INSTALLED_APPS tuple: 
for app in INSTALL_APPS: 
    try: 
     #is the module_class found in this app? 
     #App1.some_module1.SomeClass - Yes 
     #App2.some_module1.SomeClass - No 

     # is the class we found a subclass of Producer? 
    exception ImportError: 
     pass 

Tôi đã thử nghiệm với imp và importlib, nhưng dường như không xử lý loại nhập này. Có anyway cho tôi để có thể đạt được điều này?

+0

Xin lỗi - bạn không thể tìm ra điều bạn muốn - mã giả của bạn không rõ ràng. Python không quan tâm đến các lớp abse đến từ đúng nơi, làm thế nào. Vì vậy, bất kỳ App1.Class_ sẽ thấy "Nhà sản xuất" vì nó được xác định bên trong mô-đun App1. – jsbueno

+0

Xin lỗi, tôi đã cố gắng rõ ràng nhất có thể. Tôi đã chỉnh sửa bài đăng và hy vọng nó có ý nghĩa hơn. – Hanpan

Trả lời

5

Bạn có thể muốn có một cái nhìn tại địa chỉ:

  • __import__() nhập module biết tên của họ như chuỗi;
  • dir() để lấy tên của tất cả các đối tượng của một mô-đun (thuộc tính, hàm, v.v.);
  • inspect.isclass(getattr(<module ref>, <object name>)) để xác định các lớp trong số các đối tượng của mô-đun;
  • issubclass() để xác định các lớp con từ một lớp cụ thể, as explained here.

Với những công cụ này, bạn có thể xác định tất cả các lớp trong một mô-đun nhất định, kế thừa một lớp nhất định.

Tôi đang sử dụng cơ chế này để tự động khởi tạo lớp học từ mô-đun đã cho, để cập nhật của chúng được tự động đưa vào tài khoản ở cấp cao hơn.

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