Python解释器错误,x不带参数(给定1个)

时间:2010-12-14 23:40:02

标签: python object methods arguments

我正在写一小段python作为家庭作业,而我却没有让它运行!我没有那么多的Python经验,但我知道很多Java。 我正在尝试实现粒子群优化算法,这就是我所拥有的:

class Particle:    

    def __init__(self,domain,ID):
        self.ID = ID
        self.gbest = None
        self.velocity = []
        self.current = []
        self.pbest = []
        for x in range(len(domain)):
            self.current.append(random.randint(domain[x][0],domain[x][1])) 
            self.velocity.append(random.randint(domain[x][0],domain[x][1])) 
            self.pbestx = self.current          

    def updateVelocity():
    for x in range(0,len(self.velocity)):
        self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 * random.random()*(self.gbest[x]-self.current[x]) 


    def updatePosition():    
        for x in range(0,len(self.current)):
            self.current[x] = self.current[x] + self.velocity[x]    

    def updatePbest():
        if costf(self.current) < costf(self.best):
            self.best = self.current        

    def psoOptimize(domain,costf,noOfParticles=20, noOfRuns=30):
        particles = []
        for i in range(noOfParticles):    
            particle = Particle(domain,i)    
            particles.append(particle)    

        for i in range(noOfRuns):
            Globalgbest = []
            cost = 9999999999999999999
        for i in particles:    
        if costf(i.pbest) < cost:
                cost = costf(i.pbest)
            Globalgbest = i.pbest
            for particle in particles:
                particle.updateVelocity()
                particle.updatePosition()
                particle.updatePbest(costf)
                particle.gbest = Globalgbest    


        return determineGbest(particles,costf)

现在,我认为没有理由不这样做。 但是,当我运行它时,我收到此错误:

“TypeError:updateVelocity()不带参数(给定1个)”

我不明白!我没有给它任何论据!

感谢您的帮助,

莱纳斯

4 个答案:

答案 0 :(得分:119)

Python隐式地将对象传递给方法调用,但是您需要为它显式声明参数。这通常命名为self

def updateVelocity(self):

答案 1 :(得分:8)

确保您的类方法的所有(updateVelocityupdatePosition,...)至少采用一个位置参数,该参数规范地命名为{{1并引用该类的当前实例。

当您调用self时,被调用的方法会隐式获取一个参数:实例,此处particle.updateVelocity()作为第一个参数。

答案 2 :(得分:6)

您的updateVelocity()方法在其定义中缺少显式self参数。

应该是这样的:

def updateVelocity(self):    
    for x in range(0,len(self.velocity)):
        self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 \
          * random.random()*(self.gbest[x]-self.current[x])

您的其他方法(__init__除外)也有同样的问题。

答案 3 :(得分:-1)

我对这个问题感到很困惑,因为我是Python的新手。我无法将解决方案应用于被质疑的代码,因为它不是自我执行的。所以我带了一个非常简单的代码:

from turtle import *

ts = Screen(); tu = Turtle()

def move(x,y):
  print "move()"
  tu.goto(100,100)

ts.listen();
ts.onclick(move)

done()

正如您所看到的,解决方案在于使用两个(虚拟)参数,即使它们未被函数本身使用或调用它们!这听起来很疯狂,但我相信它必须有一个原因(隐藏在新手之外!)。

我尝试了很多其他方式(包括'自我')。它是唯一有效的(对我来说,至少)。