内部类可以检索顶级类的实例吗?

时间:2017-11-14 23:05:46

标签: python class inner-classes instance-variables

我正在处理的程序使用嵌套类。顶级类名为Brain,它有两个内部类NeuronAxon。内部类需要能够修改顶级类的实例变量。

Brain记录已实例化的神经元和轴突数量。 Neuron保存有关其行动潜力及其产出的信息。 Axon确定如何将能量从一个神经元穿越到另一个神经元。这样,每当我实例化神经元时,它都会保存在大脑的实例中。轴突也是如此。

到目前为止,这是我的代码:

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)

如果我需要从add()中的第一个神经元调用EntityA,我应该可以将其称为EntityA.neurons[0].add(value),因为在我创建神经元时它应该自动追加自身列表。

我将如何做到这一点,如果不可能做出类似的结果呢?

编辑:使用函数实例化类Neuron并将其保存到Brain实例中的列表中似乎是明显的答案。 问题出现在实例化Neuron.act()的函数Axon中,并且必须将其保存到{{>相同实例{{{ 1}}用于神经元。之前的限制仍然适用。

1 个答案:

答案 0 :(得分:0)

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)