2013-03-05 91 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)