2013-03-05 84 views
2

我已經實現了自己的「DataSet」類,該類繼承自列表,我需要移植該代碼以在多處理模式下運行。這裏是我班的一個示例:如何在python中繼承「Manager().list」?

class DataSet(list): 
    @property 
    def n_training(self): 
     return len(self) * 0.8 
    @property 
    def n_validation(self): 
     return len(self) * 0.2 

除了在這個類中創建的實例「經理()名單」,有什麼比較簡單的方法來做到這一點,如:

from multiprocessing import Manager 
class DataSet(Manager().list): 

請注意,「經理()名單」是

manager = Manager() 
manager.list() 
+0

''Manager'' ['multiprocessing.Manager'](http://docs.python.org/2/library/multiprocessing.html#multiprocessing.sharedctypes.multiprocessing.Manager)? – 2013-03-05 14:05:59

+0

@Lattyware:多處理包的一部分。 – 2013-03-05 14:06:27

+0

多處理列表類型是一個代理;你必須研究['managers.py'源碼](http://hg.python.org/cpython/file/2.7/Lib/multiprocessing/managers.py),看看你可以在哪裏繼承子類,而你可能需要向經理註冊類型。它應該是可能的,但。 – 2013-03-05 14:07:00

回答

1

表示據@senderle和@Martijn Pieters的建議,我設法a solution

from multiprocessing.managers import BaseManager 
from multiprocessing.managers import BaseProxy 

class DataSetClass(list): 
    @property 
    def n_training(self): 
     return len(self) * 0.8 
    @property 
    def n_validation(self): 
     return len(self) * 0.2 

class DataSetProxy(BaseProxy): 
    _exposed_ = ('append', '__len__') 
    def append(self, item): 
     return self._callmethod('append', item) 
    def __len__(self): 
     return self._callmethod('__len__') 

class MyManager(BaseManager): 
    pass 

MyManager.register('DataSet', DatasetClass, DataSetProxy) 

if __name__ == '__main__': 
    manager = MyManager() 
    manager.start() 
    dataset = manager.DataSet() 
    dataset.append('item1') 
    dataset.append('item2') 
    print len(dataset)