Error del intérprete de Python, x no toma argumentos (1 dado)

Estoy escribiendo una pequeña pieza de python como una tarea, ¡y no la voy a ejecutar! No tengo mucha experiencia con Python, pero sé bastante de Java. Estoy tratando de implementar un algoritmo de optimización de enjambre de partículas, y esto es lo que tengo:

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) 

Ahora, no veo ninguna razón por la que esto no debería funcionar. Sin embargo, cuando lo ejecuto, me sale este error:

“TypeError: updateVelocity () no toma argumentos (1 dado)”

¡No entiendo! ¡No le voy a dar ningún argumento!

Gracias por la ayuda,

Linus

Python pasa implícitamente el objeto a las llamadas de método, pero debe declarar explícitamente el parámetro para él. Esto se denomina habitualmente self :

 def updateVelocity(self): 

Asegúrese de que todos sus métodos de clase ( updateVelocity , updatePosition , …) tomen al menos un argumento posicional, que se denomina de forma canónica self y se refiera a la instancia actual de la clase.

Cuando llama a particle.updateVelocity() , el método llamado recibe implícitamente un argumento: la instancia, aquí particle como primer parámetro.

A su método updateVelocity() le falta el parámetro self explícito en su definición.

Debería ser algo como esto:

 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]) 

Sus otros métodos (a excepción de __init__ ) tienen el mismo problema.

Me ha desconcertado mucho este problema, ya que soy muy nuevo en Python. No puedo aplicar la solución al código dado por el interrogado, ya que no es auto ejecutable. Así que traigo un código muy simple:

 from turtle import * ts = Screen(); tu = Turtle() def move(x,y): print "move()" tu.goto(100,100) ts.listen(); ts.onclick(move) done() 

Como puede ver, la solución consiste en utilizar dos argumentos (ficticios) , incluso si la función en sí no los utiliza o para llamarlos. Parece una locura, pero creo que debe haber una razón para ello (¡oculta para el principiante!).

He intentado muchas otras maneras (‘yo’ incluido). Es el único que funciona (para mí, al menos).