2013-03-05 23 views
5

Tôi đang tạo ra lớp động lực mà có thể là được xác định tĩnh tại thời điểm "biên dịch". Trường hợp đơn giản mà ngay bây giờ tôi đã trông nhiều hơn hoặc ít hơn như thế này:Kết quả bộ nhớ đệm vĩnh viễn của thế hệ lớp Python

class Base(object): 
    def __init__(self, **kwargs): 
     self.do_something() 

def ClassFactory(*args): 
    some_pre_processing() 
    class GenericChild(Base): 
     def __init__(self, **kwargs): 
      self.some_processing() 
      super(GenericChild, self).__init__(*args, **kwargs) 
    return GenericChild 

Child1 = ClassFactory(1, 'Child_setting_value1') 
Child2 = ClassFactory(2, 'Child_setting_value2') 
Child3 = ClassFactory(3, 'Child_setting_value3') 

Mở nhập khẩu, các thông dịch Python dường như biên dịch để bytecode, sau đó chạy file (do đó tạo ra Child1, Child2, và Child3) một lần mỗi Ví dụ Python.

Có cách nào để nói với Python để biên dịch các tập tin, thực hiện nó một lần để giải nén các Child lớp, sau đó biên dịch đó vào tập tin pyc, do đó giải nén chỉ xảy ra một lần (thậm chí trên hành liên tiếp của kịch bản Python)?

Tôi có các trường hợp sử dụng khác phức tạp hơn và mở rộng, vì vậy chỉ cần loại bỏ nhà máy bằng cách viết tay các lớp Child không thực sự là một lựa chọn. Ngoài ra, tôi muốn tránh một bước tiền xử lý thêm nếu có thể (như sử dụng các macro kiểu C với bộ tiền xử lý C).

Trả lời

1

Không, bạn phải tạo mã Python thay vào đó thay vào đó các lớp đó được 'nướng' thành mã python.

Sử dụng một số hình thức tạo mẫu chuỗi nơi bạn tạo mã nguồn Python, lưu chúng vào các tệp .py, sau đó bytecompile những tệp đó.

Tuy nhiên, việc tạo lớp chỉ xảy ra một lần khi khởi động. Nó thực sự là một chi phí tuyệt vời để tạo ra chúng?

+0

Nó không tốn nhiều tiền cho mỗi lớp, nhưng tôi có rất nhiều trường hợp như vậy và cần phải sinh ra nhiều cá thể python thường xuyên, vì vậy nó tăng lên, đặc biệt là dưới tải cao (trong trường hợp khởi tạo có thể chiếm phần lớn thời gian cho một chương trình chạy ngắn). – CSTobey

+0

+1 để sử dụng engplating template khi tạo mã Python. – thebjorn

0

Nếu không cần phải có các lớp con riêng biệt và bạn chỉ muốn có một 'cấu hình chuẩn' cho các bộ đối tượng cụ thể đó, bạn chỉ có thể làm cho lớp ObjectFactory của bạn với cấu hình được lưu trữ trong đó. Mỗi trường hợp sẽ có thể nhổ ra GenericChildren với cấu hình thích hợp, hoàn toàn bỏ qua việc tạo ra các lớp học thời gian chạy (và lỗi gỡ rối liên kết với nó).

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