2013-08-19 42 views
7

Có cách nào để khởi tạo tất cả các lớp từ mô-đun python vào danh sách các đối tượng không tên không?Khởi tạo tất cả các lớp trong một mô-đun thành các đối tượng không tên trong danh sách

Ví dụ Tôi có một mô-đun rules chứa tất cả các lớp con từ một quy tắc lớp. Do đó, tôi chắc chắn tất cả họ sẽ thực hiện một phương pháp run() và sẽ có một thuộc tính name mà sẽ được tạo ra trong suốt cuộc gọi của __init__

Tôi muốn có một danh sách các đối tượng tự động bắt đầu từ những lớp học. Bằng cách tự động khởi tạo tôi có nghĩa là chúng không phải được đặt tên rõ ràng.

Các câu hỏi là:

Có thể lặp qua tất cả các lớp trong mô-đun không?

Đối tượng không tên có thể được bắt đầu không?

Trả lời

8

Có ít nhất hai phương pháp bạn có thể thực hiện. Bạn có thể nhận tất cả các lớp con của một lớp bằng cách gọi phương thức __subclasses__() của lớp. Vì vậy, nếu tầng lớp phụ huynh của bạn được gọi Rule, bạn có thể gọi:

rule_list = [cls() for cls in Rule.__subclasses__()] 

này sẽ cung cấp cho bạn tất cả các lớp con của Rule, và sẽ không hạn chế chúng để những người tìm thấy trong một module cụ thể.

Nếu bạn có một tay cầm cho mô-đun của mình, bạn có thể lặp lại nội dung của nó. Cũng giống như vậy:

import rule 
rule_list = [] 
for name in dir(rule): 
    value = getattr(rule, name) 
    if isinstance(value, type) and issubclass(value, Rule): 
     rule_list.append(value()) 

Thật không may, issubclass ném TypeError nếu bạn cho nó một đối tượng mà không phải là một lớp học như là đối số đầu tiên của nó. Vì vậy, bạn phải xử lý bằng cách nào đó.

CHỈNH SỬA: xử lý yêu cầu issubclass theo gợi ý của @ Blckknght.

+0

Tốt hơn câu trả lời của tôi. Bạn có thể sử dụng 'inspect.isclass()' để tránh 'TypeError'. –

+0

@AntonisChristofides Đúng, bạn có thể sử dụng 'inspect.isclass()' làm bộ lọc. Tôi cố gắng tránh sử dụng bất cứ thứ gì từ mô-đun 'kiểm tra' trong mã sản xuất, tuy nhiên. –

+0

Bạn cũng có thể sử dụng 'isinstance (value, type)' để chắc chắn rằng bạn có một lớp. (Bạn cũng cần phải kiểm tra 'types.ClassType' nếu bạn cần hỗ trợ các lớp kiểu cũ, nhưng tôi chỉ muốn tránh những lớp đó.) – Blckknght

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