如何在Python中继承“Manager().list”?

3 投票
1 回答
924 浏览
提问于 2025-04-17 18:00

我自己实现了一个名为“DataSet”的类,这个类是从列表(list)继承而来的,现在我需要把这段代码改成可以在多进程模式下运行。下面是我的类的一个示例:

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

除了在这个类中创建一个“Manager().list”的实例,还有没有更简单的方法来做到这一点,比如:

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

请注意,“Manager().list”是代表

manager = Manager()
manager.list()

1 个回答

2

根据@senderle和@Martijn Pieters的建议,我找到了解决办法,具体可以参考这个链接

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)

撰写回答