2016-01-11 15 views
5

Tôi có một lớp GenericMake lớp con có thuộc tính lớp riêng của mình

class Generic: 
    raw_data = [] 
    objects = dict() 

và các lớp bê tông

class A(Generic): 
    raw_data = module.somethingA 

class B(Generic): 
    raw_data = module.somethingB 

Tôi muốn cư mỗi raw_data vào mỗi objects dict của lớp. Để đó, tôi đang chạy:

for object_type in (A, B): 
    for data in object_type.raw_data: 
     new_object = object_type(*data) 
     object_type.objects[id(new_object)] = new_object 

Tuy nhiên, điều này không làm việc vì objects được chia sẻ giữa AB, và tôi muốn mỗi lớp con của Generic để có các đối tượng của riêng mình.

Làm cách nào để đạt được điều này mà không phải nhập objects = dict() trên mọi lớp con?

Tôi muốn nói rằng đây là trường hợp truyền thống cần có lớp meta (thêm objects vào mỗi lớp mới); đây là trường hợp, hoặc là có một lựa chọn đơn giản hơn?

Trả lời

2

Hoặc sử dụng metaclass hoặc sử dụng trình trang trí lớp học.

Một trang trí lớp học chỉ đơn giản là có thể tạo ra các thuộc tính:

def add_objects(cls): 
    cls.objects = {} 
    return cls 

@add_objects 
class A(generic): 
    raw_data = module.somethingA 

này không thực sự thêm bất cứ điều gì tuy nhiên; bạn chỉ cần thay thế một dòng (objects = {}) bằng một dòng khác (@add_objects).

Bạn chỉ có thể thêm các đối tượng trong vòng lặp của bạn:

for object_type in (A, B): 
    if 'objects' not in vars(object_type): 
     object_type.objects = {} 
    for data in object_type.raw_data: 
     new_object = object_type(*data) 
     object_type.objects[id(new_object)] = new_object 

hoặc sao chép nó (đọc thuộc tính có thể truy xuất các thuộc tính lớp cha mẹ hoặc một thuộc tính trực tiếp, nó không quan trọng ở đây):

for object_type in (A, B): 
    object_type.objects = object_type.objects.copy() 
    for data in object_type.raw_data: 
     new_object = object_type(*data) 
     object_type.objects[id(new_object)] = new_object 

hoặc tạo từ điển từ đầu:

for object_type in (A, B): 
    object_type.object = { 
     id(new_object): new_object 
     for data in object_type.raw_data 
     for new_object in (object_type(*data),)} 
1

tôi không nghĩ rằng một metaclass là necessa ry đây Tại sao không chỉ sao chép các đối tượng lớp cha trước khi populating mỗi lớp con trong vòng lặp của bạn?

for object_type in (A, B): 
    # copy Generic.objects onto object_type.objects here 
    object_type.objects = Generic.objects.copy() 
    for data in object_type.raw_data: 
     new_object = object_type(*data) 
     object_type.objects[id(new_object)] = new_object 

Ngoài ra bạn có thể sửa đổi để sử dụng super và/hoặc deepcopy nếu bạn muốn.

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