我正在处理的程序使用嵌套类。最上面的类被命名为Brain
,它有两个内部类,Neuron
和Axon
。内部类需要能够修改顶级类的实例变量。
Brain
记录有多少神经元和轴突被实例化。CCD_ 5保持关于其动作电位及其输出的信息。CCD_ 6决定了如何将能量从一个神经元传递到另一个神经元。这样,每当我实例化一个神经元时,它就会保存在大脑的实例中。轴突也是如此。
这是我迄今为止的代码:
class Brain(object):
def __init__(self):
self.neurons = []
self.axons = []
class Neuron(object):
def __init__(self, pos, AP_Energy, AP_threshold):
# General attributes
self.outputs = {}
self.Energy = 0
self.x, self.y = pos[0], pos[1]
# Action Potential attributes
self.AP_Energy = AP_Energy
self.AP_threshold = AP_threshold
"""Append self to instance
of Brain in neurons"""
def add(self, value): self.Energy += value
def link(self, neuron, weight): self.outputs[neuron] = weight
def act(self):
for neuron in self.outputs.keys():
"""Append Axon(self, neuron) to
instance of Brain in axons"""
class Axon(object):
def __init__(self, n1, n2):
# Neurons
self.n1, self.n2 = n1, n2
# Action Potential attributes
self.wavelength = sqrt((5*n1.AP_Energy)/3)
self.distance = sqrt((n2.x-n1.x)**2+(n2.y-n1.y)**2)
def action_potential(self): # Bunch of math stuff
这个想法是,你可以创建神经元,而不必将大脑的实例作为其论据之一。因此,如果我想创建一个具有两个神经元的Brain
实例,它应该如下所示:
EntityA = Brain()
EntityA.Neuron((0, 1), 15, 24)
EntityA.Neuron((4, 2), 30, 41)
如果我需要从EntityA
中的第一个神经元调用add()
,我应该能够将其称为EntityA.neurons[0].add(value)
,因为当我创建神经元时,它应该自动将自己附加到列表中。
我该怎么做?如果不可能,该怎么做才能得到类似的结果?
编辑:使用一个函数实例化类Neuron
并将其保存到Brain
实例中的列表中似乎是显而易见的答案。问题发生在函数Neuron.act()
中,该函数实例化类Axon
,并且必须将其保存到与用于神经元的Brain
的实例相同的列表中。以前的约束仍然适用。
class Brain(object):
def __init__(self):
self.neurons = []
self.axons = []
class Neuron(object):
...
class Axon(object):
...
def add_neuron(self, pos, AP_Energy, AP_threshold):
self.neurons.append(Brain.Neuron(pos, AP_Energy, AP_threshold))
EntityA = Brain()
EntityA.add_neuron((0, 10), 15, 24)