2016-01-11 44 views
5

我有一個類Generic製作子類有它自己的類屬性

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

和具體類

class A(Generic): 
    raw_data = module.somethingA 

class B(Generic): 
    raw_data = module.somethingB 

我想每個raw_data填充到每個objects字典之類的。 爲此,我運行:

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 

然而,這不起作用,因爲objectsAB之間共享,而我想的Generic每個子類有自己的對象。

如何在不必在每個子類上鍵入objects = dict()的情況下實現這一目標?

我傾向於說,這是一個傳統的情況下,需要元類(這增加了objects到每個新類);是這種情況,還是有一個更簡單的選擇?

回答

2

要麼使用元類,要麼使用類裝飾器。

類裝飾可以簡單地創建屬性:

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

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

這並沒有真正但是添加任何東西;您只需將一行(objects = {})替換爲另一行(@add_objects)。

你可以只添加對象在循環:

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 

或複製(讀取屬性可以檢索父類的屬性或屬性直接,但此處無關緊要):

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 

或從頭開始創建字典:

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

我不認爲一個元類是necessa在這裏。爲什麼不在你的循環中填充每個子類之前複製父類對象呢?

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 

此外,您可以修改使用super和/或deepcopy如果你想。