Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:如何在对象之间创建交互-对对象的引用不';好像不行_Python_Class_Reference_Simulation - Fatal编程技术网

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]