2013-11-22 3 views
0

Надеюсь, вы, ребята, можете мне помочь здесь. Я дал эту ошибку с помощью следующего кода:ОШИБКА: unbound метод «имя метода» должен быть вызван с экземпляром «Имя класса» в качестве первого аргумента (вместо этого был получен экземпляр classobj)

Traceback (most recent call last): 
    File "C:\Python27\Lib\idlelib\Tarea5.py", line 60, in <module> 
    bg.addBandit(b) 
TypeError: unbound method addBandit() must be called with BanditGroup instance as first argument (got classobj instance instead) 

Код:

from numpy import * 
from matplotlib import pyplot as p 
class Bandit: 
    power = random.uniform(15,46) 
    life = random.uniform(40,81) 
    def __init__(self, power, life): 
     self.power = power 
     self.life = life 
class BanditGroup: 
    def __init__(self,a): 
     self.group = [a] #Where 'a' is an object of the class Bandit 
    def addBandit(self,b): 
     self.group.append(b) #Where 'b' is an object of the class Bandit 
     return self.group 

howmanygroups = random.randint(4,11) 
i = 0 
j = 0 
while i <= howmanygroups: 
    bg = BanditGroup 
    howmanybandits = random.randint(1,11) 
    while j <= howmanybandits: 
     b = Bandit 
     bg.addBandit(b) #<-- line 60 
     j+=1 
    bgposx = random.uniform(0,50000) 
    bgposy = random.uniform(0,50000) 
    p.plot(bgposx,bgposy,'r^') 
    i+=1 

Я бы очень признателен, если кто-то может сказать мне, что здесь происходит. Я начал изучать python 2.7 около 2 месяцев назад. Спасибо!

+0

Вы на самом деле не делать никаких бандитов или группу бандитов, чтобы поместить их в '' Bandit' и BanditGroup' классы;. то, что ваш код пытается сделать прямо сейчас, аналогичен попытке сидеть на абстрактной концепции стула, вместо того, чтобы идти в IKEA и получать конкретный стул, чтобы сидеть. – user2357112

ответ

2

Попробуйте изменить свой код (обратите внимание на круглые скобки вокруг класса конкретизации):

while i <= howmanygroups: 
    bg = BanditGroup(a) 
    howmanybandits = random.randint(1,11) 
    while j <= howmanybandits: 
     b = Bandit(power, life) 
     bg.addBandit(b) #<-- line 60 
+2

Не забывайте, что конструкторы принимают аргументы. – user2357112

+0

@ user2357112 D'oh! Это правильно :) В спешке момента я забыл. – rdodev

+0

Да! Это был конструктор без аргументов! Я удалил запрошенный аргумент в конструкторе BanditGroup, так что теперь он работает! Благодаря! –

2

Проблема заключается в том, что для использования addBandit требуется экземпляр BanditGroup. Добавление (...) после имени класса будет создано один:

bg = BanditGroup(...) 

Прямо сейчас, у вас есть bg, указывающие на класс самого, а не экземпляр.

То же самое должно быть сделано здесь с Bandit:

b = Bandit(...) 

Примечание: ... означает передать в соответствующие аргументы. Вы сделали BanditGroup.__init__ с необходимым параметром a и Bandit.__init__ с необходимыми параметрами power и life. Поскольку я не знаю, чего вы хотите, я оставил их.

+0

Да, это было ... Мое решение состояло в том, чтобы удалить необходимый элемент a в def __init BanditGroup. Теперь он отлично работает! Большое спасибо! –

1

Да, вероятно, нужно скобки при создании экземпляра вашего Bandit и классов BanditGroup. В противном случае вы назначаете класс своим переменным, а не экземпляру класса.

EG: BG = BanditGroup()