Ответ 1
Python неявно передает объект вызовам метода, но вам нужно явно объявить параметр для него. Обычно это называется self
:
def updateVelocity(self):
Я пишу небольшой кусочек питона в качестве домашней задачки, и я не заставляю его работать! У меня не так много опыта 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 данный)"
Я не понимаю! Я не даю никаких аргументов!
Спасибо за помощь,
Линус
Python неявно передает объект вызовам метода, но вам нужно явно объявить параметр для него. Обычно это называется self
:
def updateVelocity(self):
Убедитесь, что все ваши методы класса (updateVelocity
, updatePosition
,...) принимают хотя бы один позиционный аргумент, который канонически называется self
и ссылается на текущий экземпляр класса.
Когда вы вызываете particle.updateVelocity()
, вызываемый метод неявно получает аргумент: экземпляр здесь particle
в качестве первого параметра.
В вашем методе 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__
) имеют одинаковую проблему.
Я был сильно озадачен этой проблемой, так как я недавно появился на Python. Я не могу применить решение к коду, задаваемому опрашиваемым, поскольку оно не является исполняемым самостоятельно. Поэтому я привожу очень простой код:
from turtle import *
ts = Screen(); tu = Turtle()
def move(x,y):
print "move()"
tu.goto(100,100)
ts.listen();
ts.onclick(move)
done()
Как видите, решение состоит в использовании двух (фиктивных) аргументов, даже если они не используются ни самой функцией, ни при ее вызове! Звучит безумно, но я считаю, что для этого должна быть причина (скрыто от новичка!).
Я пробовал много других способов (включая "себя"). Это единственный, который работает (для меня, по крайней мере).
Класс Dog():
def _init_(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + " is now sitting.")
def roll_over(self):
print(self.name.title() + "is now rolled over.")
my_dog = Dog ("том", 6)