如何使用地图改变对象?

2024-09-29 17:15:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,用于创建如下所示的对象:

import copy
import numpy as np

class AnObject(object):

    def __init__(self, someValue, anArray):

        self.someValue = someValue
        self.anArray = anArray

    def changeArray(self):

        newArray = self.anArray.copy()
        ix = np.random.choice(len(self.anArray))
        newArray[ix] = newArray[ix] + 0.5

        self.anArray = newArray 

        return self

每个对象都有指定给它们的特定值以及一个名为anArray的数组。此外,我还有一个函数changeArray,它改变了这个数组的内容;为了简单起见,我在这里只给这个数组中的一个值加了0.5。你知道吗

现在我有了另一个类,在其中我收集了所有这些对象来对它们执行某些操作,这些操作可能如下所示:

class AllMyObjects(object):

    def __init__(self, name = None):

        self.name = name
        self.allObjects = []

    def addObject(self, anObject):

        self.allObjects.append(anObject)

    def changeAllMyObjects(self):

        # just to express that it is not just a one-time thing but needs to be done several times

        for i in xrange(1):

            allObjectsCop = copy.deepcopy(self.allObjects)

            # this returns None for each object!
            allObjectsCop = map(lambda x: x.changeArray(), allObjectsCop)

            self.allObjects.extend(allObjectsCop)

单个对象存储在一个名为allObjects的列表中,可以向其中添加对象;也可以删除我没有显示的对象,以使示例尽可能小。你知道吗

现在我想遍历所有对象,使用函数changeArray更改它们的属性anArray,并将所有更改的数组添加到列表allObjects。你知道吗

这很好:

myObj = AllMyObjects('Test')

myObj.addObject(AnObject(someValue = 1., anArray = np.array([ 1., 2., 3.])))
myObj.addObject(AnObject(someValue = 2., anArray = np.array([ 4., 5., 6.])))
myObj.addObject(AnObject(someValue = 3., anArray = np.array([ 7., 8., 9.])))

myObj.changeAllMyObjects()

for o in xrange(6):
    print myObj.allObjects[o].anArray

这给了我想要的输出:

[ 1.  2.  3.]
[ 4.  5.  6.]
[ 7.  8.  9.]
[ 1.5  2.   3. ]
[ 4.   5.   6.5]
[ 7.5  8.   9. ]

但是,如果没有

return self

changeArray中,它不起作用,正如

map(lambda x: x.changeArray(), allObjectsCop)

然后只返回None。你知道吗

我的问题是:如果没有return self部分,怎么能做到这一点?如果我只对一个对象调用changeArray,我不希望这个函数返回任何东西,但它应该只更改数组。你知道吗


Tags: 对象selfdefnp数组copymyobjsomevalue
1条回答
网友
1楼 · 发布于 2024-09-29 17:15:01

map被设计成将某个东西转换成另一个东西,然后返回一个带有更改值的新iterable。既然你想引起副作用,你可以这样做:

for x in l:
    x.func()

相关问题 更多 >

    热门问题