2015-10-09 2 views
0

У меня есть класс, который наследует от другого класса, и я получаю вопрос:Python Наследование Проблема

Traceback (most recent call last): 
    File "main.py", line 45, in <module> 
    class Player(Entity): 
    File "main.py", line 53, in Player 
    self.image = pygame.image.load('sam_stand.png') 
NameError: name 'self' is not defined 

Эти классы:

class RigidBody(object): 
    def __init__(self, (x, y), size, mass=1): 
     self.x = x 
     self.y = y 
     self.size = size 
     self.mass = mass 
     self.thickness = 0 
     self.angle = 0 
     self.drag = 1 
     self.elasticity = 0.9 

class Player(Entity): 
    """Player class. Provides all player variables and methods""" 
    def __init__(self): 
     RigidBody.__init__(self) 
     self.grounded = True 
     self.direction = "Right" 
     self.axis = "Down" 
     self.jump_counter = 0 
     self.image = pygame.image.load('sam_stand.png') 

Каким self признается для всех другие атрибуты для Player, за исключением self.image? Если я изменю его на image = pygame.image.load('sam_stand.png'), проблема исчезнет.

+3

Ваш след не заполнен, вы забыли включить сообщение об исключении. –

+2

с 'RigidBody .__ init __ (self)' вы вызываете конструктор RigidBody, передавая ему ваш текущий объект (т. Е. Экземпляр Player) .... какова ваша цель? – Pynchia

+1

@Pynchia: это совершенно нормальное поведение, вызывая метод родительского класса '__init__', но он * unbound *, поэтому вам нужно явно перейти в' self'. В классах нового стиля, которые будут выполняться с помощью 'super (Player, self) .__ init __()' –

ответ

4

Вы смешиваете вкладки и пробелы. Глядя на ваш первый источник пересмотра я вижу это:

enter image description here

Ваш метод тело вдавливается с помощью вкладок, которые Python расширяется до 8 пространств. Последняя строка, однако, имеет только отступы . У вашего редактора установлен пробелов на вкладку, поэтому вы не видите эту ошибку.

В результате линия self.image падает наружу__init__ метод. Он является частью определения класса .

Вы действительно хотите настроить свой редактор на отступ с пробелами только.

Запустите свой код с помощью python -tt scriptname.py и исправьте все сообщения об ошибках. Затем запустите функцию tabs-to-spaces в текстовом редакторе (преобразование в 4 пробела), а затем настройте его для использования пробелов для отступов (автоматически вставляя 4 пробела при использовании клавиши табуляции).

Использование пробелов для отступов recommended by the Python styleguide по причине, в конце концов.

+0

Я вижу. Ничего себе, странно. Думаю, это имело бы смысл. Я изменю все это и сберегу массу неприятностей в будущем. Спасибо, ребята – tear728

+0

Думаю, вам также придется пересмотреть строку 'RigidBody .__ init __ (self)'. LOL – RobertB

+0

@RobertB: это отдельная проблема, а не причина ошибки. Пересмотр происходит в комментариях по этому вопросу. –

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