找不到要删除对象的列表

时间:2013-12-14 18:44:37

标签: python object python-2.7

我刚开始练习,我应该完成一个基本的'愤怒的鸟'克隆。 我陷入了想要从列表中删除对象的位置。该列表包含游戏中使用的所有障碍(方框)。 因此,如果我想在它被击中后删除一个盒子,我必须做一个方法来做到这一点。无论我怎么做,这都会失败。

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级别,但关键是我不会再在这之后再编码,所以没有必要解释所有内容。

3 个答案:

答案 0 :(得分:0)

您尚未实例化spel类。

如果你想使用这样的类,你必须实例化(创建一个实例)它。

在类之外:

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

然后你会这样称呼它的方法:

app.obstacles.remove(self)

或者就你而言,来自另一个班级:

self.spel = spel()

self.spel.obstacles.remove(self)

答案 1 :(得分:0)

您已将'spel'定义为类,而不是对象。因此,您收到一个错误,因为Python正在尝试查找spel类的成员“障碍”,这在运行单个spel对象的__init__方法之前不存在。

要将spel类的对象与您创建的每个障碍相关联,您可以尝试为障碍类的对象提供引用其关联的spel对象的数据成员。数据成员可以在障碍类'__init__函数中实例化。像这样:

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

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

希望有所帮助。

答案 2 :(得分: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>]