"object has no attribute" 即使它是在构造函数中定义的并且已经创建了一个对象的实例

"object has no attribute" even though it is defined in constructor and instance of an object has been created

也有类似的问题,但其中 none 有我正在寻找的答案。我正进入(状态: AttributeError: 'ParticleFilter' object has no attribute 'initialCoordinates' (function create_gaussian_particles) 即使我已经在 init 构造函数中定义并创建了它的一个实例,我不确定是什么问题,我试着自己查找,但没有,这是代码:

import numpy as np

class ParticleFilter(object):

    def __init__(self, N, initialConditions, imageSize):

        self.create_particles(N, initialConditions, imageSize)
        self.create_weights(N)
        self.imageSize = imageSize
        self.initialCoordinates = np.array([initialConditions[0, 0], initialConditions[0, 1]])
        self.initialStdDev = np.array([initialConditions[1, 0], initialConditions[1, 1]])

    def create_particles(self, N, initialConditions, imageSize):
        if initialConditions is None:
            self.create_uniform_particles(N, imageSize)
        else:
            self.create_gaussian_particles(N, initialConditions)

    def create_gaussian_particles(self, N, initialConditions):
        self.particles = np.empty((N, 2))
        self.particles[:, 0] = self.initialCoordinates[0] + (np.random.randn(N) * self.initialStdDev[0])
        self.particles[:, 1] = self.initialCoordinates[1] + (np.random.randn(N) * self.initialStdDev[1])

    def create_uniform_particles(self, N, imageSize):
        pass

    def create_weights(self, N):
        pass

N = 1000
initialPosition = np.array([10, 10])
initialStdDev = np.array([5, 5])
initialConditions = np.array([initialPosition, initialStdDev])
imageSize = np.array([480, 360])
pf = ParticleFilter(N, initialConditions, imageSize)

File "c:/Projects/pf2.py", line 65, in <module>
    pf = ParticleFilter(N, initialConditions, imageSize)

File "c://Projects/pf2.py", line 8, in __init__
    self.create_particles(N, initialConditions, imageSize)

File "c://Projects/pf2.py", line 18, in create_particles
    self.create_gaussian_particles(N, initialConditions)


 File "c://Projects/pf2.py", line 22, in create_gaussian_particles
    self.particles[:, 0] = self.initialCoordinates[0] + (np.random.randn(N) * self.initialStdDev[0])

AttributeError: 'ParticleFilter' object has no attribute 'initialCoordinates'

这里有几件事 - 首先,__ init __ is not a constructor。这可能看起来很迂腐,但重要的是不要把它想成一个。其次,如果您查看生成的堆栈跟踪,它会告诉您导致错误的事件的确切顺序。堆栈跟踪非常有用,而不仅仅是解释器在出现问题时发出的一堆噪音。当发生异常时,它们应该是您首先要看的东西。在这种情况下,您可以看到导致错误的行:

self.particles[:, 0] = self.initialCoordinates[0] + (np.random.randn(N) * self.initialStdDev[0])

在方法create_gaussian_particles(self, N, initialConditions)中。查看之前的堆栈帧,我们可以看到在定义 initialCoordinates 之前从 __init__(...) 调用了 create_gaussian_particles(...)。该代码以一种非常迂回的方式尝试在 属性 定义之前访问它。