2013-12-14 3 views
1

Я только что начал упражнение, где я должен выполнить базовый клон «сердитых птиц». Я застреваю в точке, где я хочу удалить объект из списка. Список содержит все препятствия, используемые в игре (боксы). Итак, если я хочу удалить окно после его удара, я должен сделать способ сделать это. Это не так, как я это делаю.Не удается найти список, чтобы удалить объект

class spel(object): 
    def __init__(self):   
     self.obstacles = [obstacle(50,pos=(200,90)),] 
    #defines all other stuff of the game 

class obstacle(object): 
    def __init__(self,size,pos): 
    #defines how it looks like 

    def break(self): 
     #methode that defines what happens when the obstacles gets destroyed 
     spel.obstacles.remove(self) 

Ошибки я получаю:

AttributeError: 'NoneType' object has no attribute 'obstacles' 

После последней строки. Прошу прощения за мой уровень noob, но дело в том, что после этого мне больше не придется писать код, поэтому нет необходимости объяснять все.

ответ

0

Вы определили «spel» как класс, а не объект. Таким образом, вы получили сообщение об ошибке, потому что Python пытается найти «препятствия» членов класса, которые не существуют до того, как запущен метод отдельных объектов spel.

Чтобы связать объект класса с каждым созданным препятствием, вы можете попытаться дать объектам класса препятствий элемент данных, который ссылается на их связанный объект. Элемент данных может быть создан в классе препятствий '__init__. Например:

class obstacle(object): 
    def __init__(self, spel, size, pos): 
     self.spel = spel 
     #etc 

    def break(self): 
     self.spel.obstacles.remove(self) 

Надеюсь, что это поможет.

+2

также не использовать break как имя метода, это зарезервированное слово – M4rtini

+0

Спасибо. Пропустил это. – andreipmbcn

+0

Спасибо! @ M4rtini Я написал игру на голландском, так что это «бит». Я просто перевел его для удобства читать ... –

0

Вы не создали экземпляр класса.

Если вы хотите использовать класс, подобный этому, вы должны изучить его (создать экземпляр).

Вне класса, как так:

app = spel() # app is an arbitrary name, could be anything 

тогда вы могли бы назвать это метод, как это:

app.obstacles.remove(self) 

Или вы так, из другого класса:

self.spel = spel() 

self.spel.obstacles.remove(self) 
+0

Я знаю, я просто не добавить все это к моему сообщению (извините за то, что неясно) –

+0

нормально, но это то же, что и ваш принятый ответ – Totem

0

Я предлагаю следующее:

class spel(object): 
    obstacles = [] 
    def __init__(self,size,pos):   
     spel.obstacles.append(obstacle(size,pos)) 
     #defines all other stuff of the game 

class obstacle(object): 
    def __init__(self,size,pos): 
     self.size = size 
     self.pos = pos 
    def brak(self): 
     #methode that defines what happens when the obstacles gets destroyed 
     spel.obstacles.remove(self) 

from pprint import pprint 

a = spel(50,(200,90)) 
pprint(spel.obstacles) 
print 

b = spel(5,(10,20)) 
pprint(spel.obstacles) 
print 

c = spel(3,None) 
pprint(spel.obstacles) 
print 

spel.obstacles[0].brak() 
pprint(spel.obstacles) 

возвращение

[<__main__.obstacle object at 0x011E0A30>] 

[<__main__.obstacle object at 0x011E0A30>, 
<__main__.obstacle object at 0x011E0B30>] 

[<__main__.obstacle object at 0x011E0A30>, 
<__main__.obstacle object at 0x011E0B30>, 
<__main__.obstacle object at 0x011E0AF0>] 

[<__main__.obstacle object at 0x011E0B30>, 
<__main__.obstacle object at 0x011E0AF0>] 
+0

Спасибо, но решение @andreipmbcn дало мне то, что я должен делать. Интересно, однако, видеть ваше, поскольку я не знал, что вы могли бы разместить вещи до «def__init__» –

Смежные вопросы