Ich hoffe ihr könnt mir hier draußen helfen. Ich habe diesen Fehler durch den folgenden Code erhalten:

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)

Der Code:

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

Ich würde mich sehr freuen, wenn mir jemand sagen könnte, was hier los ist. Ich habe vor ungefähr 2 Monaten angefangen, Python 2.7 zu lernen. Vielen Dank!

0
Tarik Riadi 23 Nov. 2013 im 03:45

3 Antworten

Beste Antwort

Versuchen Sie, Ihren Code in zu ändern (beachten Sie die Klammern zur Klasseninstanziierung):

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

Das Problem ist, dass für addBandit eine Instanz von BanditGroup verwendet werden muss. Durch Hinzufügen von (...) nach dem Klassennamen wird Folgendes erstellt:

bg = BanditGroup(...)

Im Moment zeigt bg auf die Klasse selbst , nicht auf eine Instanz davon.

Das gleiche muss hier mit Bandit gemacht werden:

b = Bandit(...)

Hinweis: ... bedeutet, die entsprechenden Argumente zu übergeben. Sie haben BanditGroup.__init__ mit einem erforderlichen a Parameter und Bandit.__init__ mit den erforderlichen power und life Parametern erstellt. Da ich nicht weiß, was Sie wollen, habe ich sie weggelassen.

2
23 Nov. 2013 im 00:09

Ja, wahrscheinlich benötigen Sie Parens, wenn Sie eine Instanz Ihrer Bandit- und BanditGroup-Klassen erstellen. Andernfalls weisen Sie Ihren Variablen eine Klasse zu, keine Instanz einer Klasse.

EG: bg = BanditGroup ()

1
dstromberg 23 Nov. 2013 im 00:01