Я не уверен, почему добавление дополнительного атрибута является проблемой эффективности - это не повлияет на скорость и увеличит размер объекта только на 10 байт или около того. Поэтому, если вы не имеете дело с миллионами агентов (миссис Анндерссссонн), я бы не беспокоился об этом.
В качестве альтернативы вы можете иметь одну поверхность, которая создается в модуле как локальная и доступна через метод модуля (немного чище, чем глобальный). Так что-то вроде:
import TheSurface
class Agent:
...
def Move(self,x,y):
surface = TheSurface.getSurface()
surface.canIMoveTo(x,y)
....
TheSurface.py будет иметь какой-то метод инициализации, который создает поверхность, который должен вызываться при запуске программы. @DesignPattern people: это шаблон «синглтон»?
Лучше всего создать агента с поверхностью и сохранить его в качестве атрибута. Я не понимаю, почему вы добавили его в Точку.
Структура выглядит примерно так:
- Агент на поверхности
- Агент в точке
Следовательно, вы можете сделать вывод, что точка находится на поверхности, и нет необходимости моделировать ее отдельно, если, возможно, вы не имеете дело с точками, которые каким-либо образом не связаны с агентами, но тогда у вас будет контекст поверхности в любом случае. Всегда будет «Хорошо, теперь я должен поместить несколько деревьев на эту поверхность - createTree (поверхность, точка)» и т. Д. Все на поверхности имеет поверхность и точку.