python:如何在对象之间创建交互-对对象的引用不';好像不行
我试图创建一组以不同方式相互作用的对象(神经种群模拟)——因此一个对象可能连接到另外两个对象和一些外部变量,另一个对象可能连接到另一个对象和自身,等等 我对面向对象的东西很陌生。我的方法是让我的类有一个列表python:如何在对象之间创建交互-对对象的引用不';好像不行,python,class,reference,simulation,Python,Class,Reference,Simulation,我试图创建一组以不同方式相互作用的对象(神经种群模拟)——因此一个对象可能连接到另外两个对象和一些外部变量,另一个对象可能连接到另一个对象和自身,等等 我对面向对象的东西很陌生。我的方法是让我的类有一个列表self.connections=[],其中列出了它与其他对象之间的所有连接(我想在某个时候将所有连接相加),方法: def addNewConnection(self,strength,source,name): newConnection=Connection(strength,s
self.connections=[]
,其中列出了它与其他对象之间的所有连接(我想在某个时候将所有连接相加),方法:
def addNewConnection(self,strength,source,name):
newConnection=Connection(strength,source,name) # named tuple or class
self.connections.append(newConnection)
然后在模拟的每个时间步,我可以计算来自所有不同来源的净输入:
netInput+=[c.source * c.weight for c in self.connections]
但我不知道如何将源代码作为引用而不是值传递!因为数值很可能随着模拟的进行而变化。我的猜测是做一些关于可变类型的事情,比如将source的值设为1个元素的列表。。。但这在计算上不是很昂贵吗?编辑:也不起作用。听起来你试图构建的是一个图表。请看一看图形库,例如或,以处理您的数据结构 在此设置中,您将有两个数据结构:
from collections import namedtuple
Connection=namedtuple("Connection",["source","strength"])
class Unit(object):
# these first two methods just let me set up units and connections:
def __init__(self,par=1, response=[0], connections=[]):
self.par=par
self.response=response
self.connections=dict()#[]
def receiveConnection(self,source,strength,label):
# source is some other variable, strength is probably fixed but
# i'd like it to be able to change, too
#cx = Connection(label,source,strength)
#self.connections.append(cx)
self.connections[label]=Connection(source,strength)
# stuff that gets done iteratively through the sim
def update(self):
netInput=0.
# based on the value of all the sources and weights right now,
for item in self.connections.itervalues():
netInput+= item.source[0] * item.strength
self.response[0] += self.par * netInput
if __name__=="__main__":
Unit1 = Unit()
Unit2 = Unit(response=[1])
Unit1.receiveConnection(source=Unit2.response,strength=.5,label="U2toU1")
Unit2.receiveConnection(source=Unit2.response,strength=-.5,label="negativeFeedback")
for t in xrange(10):
Unit1.update()
print 'Unit1: ' + str(Unit1.response)
Unit2.update()
print 'Unit2: ' + str(Unit2.response)
这实际上似乎是可行的,只是很笨重(而且它甚至没有合法的功能):
无论如何,您必须决定何时重新计算
netInput
。当c.source
值发生变化时,没有办法让netInput
发生变化(即使它们发生了变化,每次值发生变化时重新计算都是浪费时间的:在所有c.source
值发生变化时进行。“我不知道如何将源代码作为引用而不是值传递。”。参数总是通过引用传递。确实,def frob(x):x=which
不会在函数外部修改x
的值。但这更多的是赋值的错误,而不是函数调用的错误。您的“传递可变类型”是正确的想法。我不认为一个元素列表比一个整数贵很多。试着创建一个简短的、自包含的示例,显示您遇到问题的行为。也就是说,创建一个虚拟的“源”和一个简单的函数,并显示由于您提到的引用/值问题而无法执行的操作。响应特定示例比响应一般描述更容易。源代码是什么类型的?通常是另一个对象的属性。该属性通常是某个浮点值,可获得pdated,ie Unit1.response可能是一个来源。我感谢你花时间回答。我没有接受这个答案的原因是我想学习(并问了一个关于Python问题的问题),而不是图论:)虽然我相信你说这可以解决我的问题,它实际上并没有向我展示如何使用这些工具来实现这一点。我也不相信让对象通过引用彼此的属性进行交互会如此困难--这个问题应该有我特定领域之外的应用程序。你所描述的方法是正确的,你提到的单元素列表方法可能是你最好的选择。然而,我试图把你引开有两个原因:1)你说你的列表尝试不起作用,但你没有给我们足够的细节来帮助你调试它。如果您共享一些代码和更具体的错误消息,我们可以帮助您修复它。2) 我认为图形方法是一种更好的抽象方法,在长期内更易于维护。它还可以让您访问现有代码库,而不必重写遍历算法。我当然很感兴趣,我只是不知道如何将算法转换为图形。
Unit1: [0.5]
Unit2: [0.5]
Unit1: [0.75]
Unit2: [0.25]
Unit1: [0.875]
Unit2: [0.125]
Unit1: [0.9375]
Unit2: [0.0625]
Unit1: [0.96875]
Unit2: [0.03125]
Unit1: [0.984375]
Unit2: [0.015625]
Unit1: [0.9921875]
Unit2: [0.0078125]
Unit1: [0.99609375]
Unit2: [0.00390625]
Unit1: [0.998046875]
Unit2: [0.001953125]
Unit1: [0.9990234375]
Unit2: [0.0009765625]