2015-09-15 12 views
5

Tôi đang tạo một mô-đun mà tôi muốn coi là một vùng chứa tĩnh của các đối tượng. Các đối tượng này thuộc loại lớp mà tôi đã xác định. Tôi muốn có thể nhập mô-đun này và sau đó lặp lại các đối tượng bên trong. Dưới đây là một số mã giải thích những gì tôi muốn nói:Có thể tạo mô-đun lặp lại được bằng Python không?

example.py

class MyExampleClass(object): 
    def __init__(self, var1, var2, var3): 
     self.var1 = var1 
     self.var2 = var2 
     self.var3 = var3 
     self.var4 = var4 

instanceA = MyExampleClass(1, 2, 3, 4) 
instanceB = MyExampleClass(4, 3, 6, 7) 
instanceC = MyExampleClass(5, 3, 4, 5) 

# something like this 
def __iter__(): 
    return (instanceA, instanceB, instanceC) 

Sau đó, tôi muốn để có thể nhập khẩu này và sử dụng nó như một enum:

import example 

for e in example: 
    # do stuff with e 

Is điều này có thể làm trong Python? Hoặc tôi có phải nhập danh sách từ trong gói example không?

example.py

objects = (instanceA, instanceB, instanceC) 

và sau đó

import example 

for e in example.objects: 
    # do stuff with e 
+3

Giải pháp thứ hai chắc chắn hoạt động. Tại sao không sử dụng? – mdurant

+2

hoặc nếu bạn không thích phiên bản đó vì lý do nào đó, tương đương 'từ các đối tượng nhập ví dụ; cho e trong các đối tượng: '... –

+1

Bạn có thể làm điều đó, nếu bạn thêm một số đối tượng vào sys.modules có API thích hợp để lặp lại. Bạn không chắc chắn liệu nó có cần được bắt nguồn từ 'ModuleType.' – schlenk

Trả lời

3

Bạn có thể đạt được điều đó bằng cách định nghĩa một lớp rễ trong module của bạn và thay thế các mô-đun với một thể hiện của lớp đó. Dưới đây là một ví dụ:

class ModuleClass(object): 
    __init__(self): 
     self.instanceA = MyExampleClass(1, 2, 3, 4) 
     ... 

    __iter__(self): 
     # Your iterator logic here 

# and then in the same module code 
sys.modules[__name__] = ModuleClass() 

Vì vậy, sau đó bạn có thể làm những gì bạn muốn, bởi vì khi bạn nhập mô-đun đó, nó sẽ thực sự là một thể hiện của tùy chỉnh của bạn iterable ModuleClass:

import example 

for e in example: 
    # do stuff with e 
+0

Điều này dường như không hoạt động nếu tôi cố gắng nhập 'ví dụ' trong hai tập tin riêng biệt; tập tin đầu tiên suy nghĩ đúng 'ví dụ' là một thể hiện của' ModuleClass' nhưng tệp thứ hai vẫn nghĩ rằng 'ví dụ' là một mô-đun – ahuff44

+0

Hmm thú vị, bạn có thể đăng một số lỗi không? – bagrat

+0

Tệ của tôi; Tôi chắc đã mắc lỗi. Khi tôi tạo ra một dự án mới để kiểm tra điều này, các lỗi đã biến mất – ahuff44

3

Mặc dù tôi làm không khuyên bạn nên, bạn có thể xây dựng mô-đun của riêng bạn bằng cách kế thừa từ types.ModuleType. Sau đó, bạn có thể thay thế mô-đun ban đầu bằng lớp tùy chỉnh của mình bằng sys.modules[__name__] = NewModule()

import types 
import sys 

class MyExampleClass(object): 
    def __init__(self, var1, var2, var3, var4): 
     self.var1 = var1 
     self.var2 = var2 
     self.var3 = var3 
     self.var4 = var4 

class MyModule(types.ModuleType): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.instanceA = MyExampleClass(1, 2, 3, 4) 
     self.instanceB = MyExampleClass(4, 3, 6, 7) 
     self.instanceC = MyExampleClass(5, 3, 4, 5) 

    def __iter__(self): 
     return iter([self.instanceA, self.instanceB, self.instanceC]) 

sys.modules[__name__] = MyModule("example") # Name of the module 
+0

Chỉ cần .... Tôi có thể thấy lý do tại sao nó không được khuyến khích. –

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