Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 19, 2013 21:16:07

Kongfu
Зарегистрирован: 2013-12-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Здравствуйте.
Лутца прочитал, но видимо что-то недопонял
Предположим у меня есть программа в которой определена функция loadlevel(). Есть так же модуль player, который импортируется в основную программу. В модуле player проверяется проверка на столкновение. Если игрок “сталкивается” с телепортом - надо вызвать функцию loadlevel().
Сам вопрос:
можно ли делать перекрестный импорт (импортить плеер в мейн и мейн в плеер)? понятно что это костыль, но не сломает ли он чего-нибудь (одинаковых переменных, например, нет) (очевидно что нет)
Как это должно выглядеть красиво? У меня уже игра на 8 модулей, хотя функций всего ничего. Похоже придется сгружать все общие функции в отдельные модули?

Второй вопрос (появился после решения первого вопроса костылем)
Есть два игровых уровня. Игрок находился на первом, необходимо загрузить второй уровень, а значит очистить список стен. Список стен в главном модуле blocks. Вызываю функцию loadlevel из модуля, в ней прописываю global blocks и изменяю этот список. Но список не изменяется. Т.е. внутри самой функции он изменился, а список в основном коде программы нет. Пытался изменять список с припиской имени модуля - main.blocks - тоже не вышло. Можно сделать чтобы вызов функции возвращал новый список, но мне необходимы еще координаты героя и другие переменные - получается очень много и некрасиво. Подскажите как сделать правильно.


Небольшой пример иллюстрирующий второй случай:

test.py
import test2
x = ()
print x
test2.n()
print x
x = test2.x
print x

test2.py
def n():
test.x = (5,4)


второй случай заработал, хотя наверное будет правильным копировать данные, а не указывать их на один объект (приравнивать)




Отредактировано Kongfu (Дек. 19, 2013 23:20:57)

Офлайн

#2 Дек. 19, 2013 22:52:50

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Kongfu
а вы не думали что подобные вещи решаются просто - использованием классов?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Дек. 19, 2013 23:04:02

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Действительно. Классы решат все Ваши проблемы. Лутца, может вы и прочитали, но понять - пока не поняли

P.S. Если действительно непонятен механизм использования классов да и вообще объектно -ориентированная концепция, то я рекомендую почитать что-нибуть именно по ней. Я читал Буч Г. “Объектно-ориентированный анализ и проектирование с примерами приложений”, хотя сейчас уже наверное книг по этой теме навалом…

Офлайн

#4 Дек. 19, 2013 23:11:02

Kongfu
Зарегистрирован: 2013-12-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Но я не могу в модуле ребенка, изменить родительскую переменную, ведь так?
В частности не получается изменить координаты игрока (написан классом), не возвращая значения из функции второго модуля в главный

Офлайн

#5 Дек. 19, 2013 23:13:43

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Я не понимаю Вашу терминологию. Что понимается под родителем, а что под ребенком?

Офлайн

#6 Дек. 19, 2013 23:20:11

Kongfu
Зарегистрирован: 2013-12-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Родитель - главный модуль, куда импортируется побочный
Ребенок - импортируемый модуль
В первом посте родитель это test.py, ребенок это test2.py

Офлайн

#7 Дек. 19, 2013 23:32:07

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Причем здесь импорт? Мы говорим о классах. Вам же выше уже написали.
Импортировать можно один модуль. Там может быть множество классов.
Классы являются объектами и обладают своими методами и атрибутами. Именно обращаясь к атрибутами и использую методы объектов можно строить логику выполнения программы…

А зачем импортируемому модулю изменять параметра модуля, который его импортирует. Как Вы вообще себе такое поведение представляете. Нужно четко разграничить задачи. Храните данные, которые касаются многих модулей и могут менятся многими модулями в базе. Существует множество параметров для оценки рациональности создания класса. Один из них: связанность (сила связей между отдельными компонентами). Сильная связанность усложняет программу, так как сильно связанные модули сложнее поддерживать и модифицировать. А вы как раз хотите все жестко связать.
Еще есть связность, достаточность, полнота, элементарность.

Отредактировано 4kpt_II (Дек. 19, 2013 23:37:38)

Офлайн

#8 Дек. 20, 2013 02:26:20

Kongfu
Зарегистрирован: 2013-12-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Это ВЫ говорите о классах. А я говорю про интеграцию модулей. Вот моя ситуация:

main.py

Class Player(object): # класс героя
def __init__(self,x,y):
self.x = x
self.y = y

hero = Player(5,5) # создаю героя с координатами

загружаю уровень 1, в нем:
collision = ( (1,1), (1,2), (3,3) ) # непроходимые стены

#герой доходит до портала на другой уровень. Необходимо перерисовать карту, “телепортировать” героя (изменить его координаты) и переписать список столкновений. Функция загрузки карты у меня в модуле loadlevel.py

import loadlevel.py

def loadlvl():
x = 10
y = 15
collision = ( (2,1), (1,3) )

эти значения надо передать в файл main.py, чтобы изменить координаты игрока и список столкновений. Как это сделать кроме использования return x,y, collision ?

В процессе написания этого пришло осознание - можно написать класс уровня в дополнительном модуле, создать объект класса в основном и изменять его переменные с помощью методов класса.

Спасибо за помощь

Отредактировано Kongfu (Дек. 20, 2013 02:30:02)

Офлайн

#9 Дек. 20, 2013 04:19:08

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вопрос по областям видимости и модулям

Есть такое выражение “Каждый веб-програмист хотя бы раз пытался написать свою CMS”, которое перенося на программистов могла бы звучать так: “Каждый программист хотя бы раз пытался написать свою игру”. У меня было аж 2 опыта забавы ради.

Kongfu
В процессе написания этого пришло осознание - можно написать класс уровня в дополнительном модуле, создать объект класса в основном и изменять его переменные с помощью методов класса.
. Я об этом вам и намекал, область видимости это лишь повод что бы понять о том что ВСЕ такие вещи делаются на классах из за их возможностей по налаживанию взаимосвязей между объектами. Сделать что то серьезное исключительно на скриптах в стиле функционального программирования могут только прокаченные прогеры, потому что они точно знают что делают. А вы, я предсказываю, десятки раз переделаете код и в итоге он будет ничем не похож на текущий. Причем речь не идет о непосредственно коде (Class как объявление класса уже синтаксическая ошибка), а я говорю об архитектурно-структурной основе проекта.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Дек. 20, 2013 12:29:38

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Вопрос по областям видимости и модулям

Черт возьми, ну если хочется так, то переменные, которые нужны из вне, в теле функции объявляйте global и обращайтесь к ним через имя модуля (из другого модуля).

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version