2015-05-17 2 views
0

Я использую библиотеку pysdl2. self.velocity будет печатать, но self.forward_tick сбрасывать ключевую ошибку.Атрибут установки ошибки объекта sdl2

Что вызывает назначение только части атрибутов self. Я думаю, что это имеет какое-то отношение к наследованию.

class Robot(sdl2.ext.Entity): 
    def __init__(self, world, sprite, posx=0, posy=0): 
     self.sprite = sprite 
     self.sprite.position = posx, posy 
     self.velocity = Velocity() 
     self.forward_tick = 0 
     self.go_forward = 0 
     self.unit_forward = (1,0) 
     print(self.velocity) 
     print(self.forward_tick) 

Вот результат:

Collins-MacBook-Air:soccer_bots collinbell$ python test_simulation_world.py 
<simulation_world.Velocity object at 0x108ecb5c0> 
Traceback (most recent call last): 
    File "/Users/collinbell/.pyenv/versions/3.4.3/lib/python3.4/site-packages/sdl2/ext/ebs.py", line 53, in __getattr__ 
    ctype = self._world._componenttypes[name] 
KeyError: 'forward_tick' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "test_simulation_world.py", line 3, in <module> 
    world = Simulation_World("Test Simulation", 1080, 720) 
    File "/Users/collinbell/Programs/soccer_bots/simulation_world.py", line 100, in __init__ 
    self.player1 = Robot(self.world, sp_paddle1, 0, 250) 
    File "/Users/collinbell/Programs/soccer_bots/simulation_world.py", line 22, in __init__ 
    print(self.forward_tick) 
    File "/Users/collinbell/.pyenv/versions/3.4.3/lib/python3.4/site-packages/sdl2/ext/ebs.py", line 56, in __getattr__ 
    (self.__class__.__name__, name)) 
AttributeError: object ''Robot'' has no attribute ''forward_tick'' 

ответ

2

Из документов на component-based design with sdl2.ext, то Entity тип является особенным, и не следовать обычным идиомы Python. В частности, вы не можете просто создавать произвольные атрибуты; Вы можете создать только атрибуты, значение которых является типом компонента, и чьего имя является строчным вариантом этого типа:

Entity объектов определяют объекты в-приложения и состоит только из атрибутов компонентов на основе.

...

Entity также requries его атрибуты, чтобы называться именно так, как их компонент имени класса, но строчными буквами.

Таким образом, при попытке добавить атрибут с именем forward_tick, который вызывает Entity.__setattr__ идти за класс с именем Forward_Tick в типах компонентов в мире. Который, по-видимому, делает это, просматривая self._world._componentypes[name], что является линией, которая фактически поднимает исключение, как вы можете видеть в трассировках.


Не зная ничего больше о вашем коде и дизайна, чем крошечный фрагмент вы показали нам, я не могу сказать вам, как это исправить. Но, скорее всего, это один из следующих действий:

  1. Вы на самом деле хотели создать Component, не является Entity,
  2. Вы хотели завернуть forward_tick в типе Component что Entity может содержать или
  3. Вы не хотели иметь нужный дизайн в Component.

Во всяком случае, так как документы говорят:

Если вы только начинаете с таким [компонентно-ориентированным] дизайном, рекомендуется прочитать The Pong Game tutorial.

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