我有一个类,用于创建如下所示的对象:
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
,我不希望这个函数返回任何东西,但它应该只更改数组。你知道吗
map
被设计成将某个东西转换成另一个东西,然后返回一个带有更改值的新iterable。既然你想引起副作用,你可以这样做:相关问题 更多 >
编程相关推荐