我有一个orc
对象和一个radar
对象需要跟踪它可以看到的orc
。我正在使用列表跟踪orc
,但是当我尝试从列表中提取orc
(或关于它的数据)时,我得到属性错误。
确切的错误是:
AttributeError: type object 'orc' has no attribute 'name'
这里是雷达等级
from source.orc import orc
class radar(object):
"""
radar Class
"""
def __init__(self, maxOrcs=25):
self.maxOrcs = maxOrcs
self.numOrcs = 0
self.orcList = [orc]
logger.info('Radar created!')
def addOrc(self, orc=None):
self.numOrcs = self.numOrcs +1
self.orcList.append(orc)
logger.info('Orc added to battlefield!')
def distance(self, name):
retVal = None
logger.debug('calculating distance')
for orc in self.orcList:
if name in orc.name:
retVal = ( (500 - orc.locx) + (500 - orc.locy) )
break
return retVal
如果它对orc类有帮助
class orc(object): #Orc class
def __init__(self, name='Krusk', locx=1, locy=1, speed=1):
#set name
if(len(name) < 20):
self.name = name
else:
self.name = 'Krusk'
logger.warning('Default name used')
#set x coord
if(isinstance(locx, int) != True):
self.locx = 1
logger.warning('x coordinate set to 1, Not an int')
elif(locx < 1):
self.locx = 1
logger.warning('x coordinate set to 1, passed value to low')
elif(locx > 1000):
self.locx = 1000
logger.warning('x coordinate set to 1000, passed value to high')
else:
self.locx = locx
#set y coord
if(isinstance(locy, int) != True):
self.locy = 1
logger.warning('x coordinate set to 1, Not an int')
elif(locy < 1):
self.locy = 1
logger.warning('y coordinate set to 1, passed value to low')
elif(locy > 1000):
self.locy = 1000
logger.warning('x coordinate set to 1000, passed value to high')
else:
self.locy = locy
#set speed
if(speed < 0):
self.speed = 0
logger.warning('speed set to 0, passed value cannot be negative')
else:
self.speed = speed
logger.info('Orc created!')
答案 0 :(得分:4)
您未在此处创建orc
课程的实例:
self.orcList = [orc]
您在那里使用了类,orc
类没有名称属性。也许您打算创建一个实例:
self.orcList = [orc()]
您的代码也使用orc
作为类的名称和局部变量(在循环中或作为函数参数),这增加了混淆的可能性。
您应该为您的类使用CamelCase命名来避免这种情况;请参阅Python styleguide:
class Orc(object):
和
class Radar(object):
并创建您的实例:
self.orcList = [Orc()]
虽然self.orc_list
会更好,但如果您仍在关注样式指南。
答案 1 :(得分:2)
我同意其他人认为这行代码是问题所在:
self.orcList = [orc]
然而,我不同意他们该怎么做。我认为您不希望在初始化程序中将任何内容放在列表中。我想你想创建一个空列表:
self.orcList = []
在您添加调用addOrc()时可以接受条目。这与在初始化程序中将计数设置为0对齐。最有意义的是,因为初始化程序没有收到要添加到列表中的orc对象。
编辑:
由于您是按名称从列表中检索的,因此您可能会考虑使用按名称键入的dict作为存储而不是列表。一个字典可以让你直接访问所需的兽人,而不必经过整个列表,直到你找到你想要的那个。
self.orclist = {}
self.orclist[orc.name] = orc
chosen = self.orclist[name]
# do whatever with chosen
而不是:
for orc in self.orclist:
if orc.name == name:
# do whatever