2015-08-02 6 views
-1

У меня есть три класса:. Item, Weapon и BrassSword Когда я пытаюсь получить доступ к одной из BrassSword «s атрибуты ех (. Имя, изображение и т.д.) Он говорит, AttributeError: class BrassSword has no attribute 'image'Python-Object AttributeError атрибут при обращении к классу питон

Вот код:

import pygame, math, random 

class Item(object): 
    def __init__(self,name,image,reuseable,value): 
     self.image=pygame.image.load(image) 
     self.itemattrs = ['name','image','reuseable','value'] 
     self.path = image 
     self.name = name 
     self.x=0 
     self.y=0 
     self.reusable = reuseable 
     self.value = value 
     self.rect = [self.x,self.y,self.image.get_size()[0],self.image.get_size()[1]] 
    def onUse(self): 
     pass 
    def onThrow(self): 
     pass 

class Weapon(Item): 
    def __init__(self,name,image,value,damage,maxdamage,speed): 
     super(Weapon,self).__init__('Weapon',image,True,value) 
     self.itemattrs = ['name','image','damage','maxdamage','value','speed'] 
     self.damage=damage 
     self.maxdamage=maxdamage 
     self.speed = speed # Cooldown in frames 
     self.cooldown = 0 
    def onUpdate(self): 
     self.cooldown -= 1 
    def onUse(self,targetEntity): 
     if self.cooldown > 0: 
      return 
     self.cooldown = speed 
     targetEntity.hp-=random.range(damage,maxdamage) 

     if targetEntity.hp <= 0: 
      targetEntity.onDie() 
    def onThrow(self): 
     pass # TODO: Add throwing weapons 

class BrassSword(Weapon): 
    def __init__(self): 
     super(BrassSword,self).__init__('item.weapon.brass_sword','testlevel/Ball.png',True,value,3,10,12) 
+1

Выполнение 'self.attrs = [«имя»,«изображение»,«многоразовых»,«значение»]' дает экземпляр класса атрибута с именем 'attrs', что список строки, _не отдельные атрибуты с именем 'name', 'image', 'reuseable' и 'value'. – martineau

+1

Почему вы передаете 'self' в качестве первого аргумента' __init__' при использовании 'super'? – Pynchia

+0

К сожалению. Спасибо, люди. – Cplusplusplus

ответ

4

вы не отправлял код, который на самом деле вызывает ошибку, а именно - когда вы получаете доступ к атрибуту. Однако вы не можете получить доступ к атрибуту экземпляра, обратившись к классу - они хранятся в отдельном __dict__. Ваш суперкласс устанавливает эти атрибуты, когда он создается в __init__(), как свойство self. После этого они могут быть доступны только через этот экземпляр self.

Если вы пытаетесь получить доступ к атрибуту подобно этому:

a = BrassSword.image 

вместо этого, вы хотите получить доступ к этому что-то вроде этого:

sword = BrassSword() 
a = sword.image 

или:

sword = BrassSword().image 

Если вы хотите, чтобы одно изображение было общим для всех экземпляров BrassSword, вам нужно объявить его атрибутом класса, например это:

class BrassSword(Weapon): 
    image = 'path/to/image' 
    def __init__(...): 
     ... 
+0

Хорошо, что это работает сейчас, благодаря всем вам! – Cplusplusplus