2012-11-29 25 views
8

tôi đã mô-đun foo, bên trong mô-đun này, tôi tự động tạo ra lớp:python làm thế nào để đăng ký lớp học năng động trong mô-đun

def superClassCreator(): 
    return type("Bar", (object,), {}) 

Bây giờ, những gì tôi muốn đạt được là làm cho lớp năng động mới này có thể nhìn thấy như một lớp mô-đun này:

import foo 
dir(foo) 
>>> [... 'Bar' ...] 

Bạn có biết cách thực hiện việc này không?

+0

ngữ pháp nazi ở khắp mọi nơi;) – mnowotka

+1

Cú pháp nazi! :-P –

Trả lời

13

Bạn có thể sử dụng Bar = superClassCreator() trong foo (ở cấp mô-đun).

Ngoài ra, từ mô-đun khác, bạn có thể thêm Bar như một thuộc tính trên foo:

import foo 

foo.Bar = superClassCreator() 

hoặc, nếu tên phải được lấy từ các lớp được tạo ra:

import foo 

generatedClass = superClassCreator() 
setattr(foo, generatedClass.__name__, generatedClass) 

Từ bên trong Mô-đun foo, bạn có thể đặt trực tiếp trên globals():

generatedClass = superClassCreator() 
globals()[generatedClass.__name__] = generatedClass 
del generatedClass 

với tuyên bố del tùy chọn để xóa tên generatedClass khỏi không gian tên một lần nữa.

+0

Ở cấp độ toàn cầu. –

+0

Điều gì xảy ra nếu tên được tạo động? Bạn không thể làm điều này trong trường hợp đó. – mnowotka

+0

Khi tôi in generatedClass .__ module__ Tôi thấy nó khác nhau sau đó foo. Trên thực tế tôi muốn đặt nó trong mô-đun đó và không phải trong foo. Tôi có nên viết setattr (generatedClass .__ module__, generatedClass .__ name__, generatedClass) trong trường hợp đó không? – mnowotka

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