Импорт из модуля и отсутствие необходимости создавать повторяющиеся импорта / переменные

#python #import #module #pygame #redundancy

#python #импорт #модуль #pygame #избыточность

Вопрос:

Я снова оказываюсь здесь, отчаянно умоляя об ответах 🙂

Итак, у меня проблема с импортом в python. У меня есть мой основной код, импортирующий вторичный модуль, который содержит только один класс. Я пытаюсь импортировать и использовать этот класс без необходимости импортировать что-либо внутри вторичного модуля. ТЕМ не менее, Python ловит меня и говорит, что определенные вещи не существуют и т. Д. И т. Д. Вот так.

   File "C:UsersCR0SS0V3RDesktopPathogenmutations.py", line 24, in draw
pygame.circle.draw(screen, self.color, (self.posx, self.posy), 5, 0)
NameError: global name 'pygame' is not defined
 

Python просит меня снова импортировать Pygame. Я просто хочу, чтобы код класса загружался из дополнительного модуля, чтобы я мог использовать его в своей основной программе. Я не могу создать другой экземпляр screen , поскольку я должен использовать только один для отображения графики на экране. Мне бы очень хотелось избежать повторной избыточности импорта модулей. Я хочу, чтобы мои программы были чистыми, с точки зрения ООП. Является ли создание отдельного файла для классов слишком большим вопросом? Пожалуйста, помогите. Я не спал всю ночь в поисках ответов, но безрезультатно.

Подготовьтесь к стене текста.

Это весь код моего вторичного модуля. (Один класс.)

 class RadiantRegrowth:

def __init__(self):
    self.name = "Radiant Regrowth"
    self.posx = 0
    self.posy = 0
    self.spawned = False
    self.color = (0,255,0)

def applyaffect(self, target):
    if self.spawned == True:
        target.health  = 1
    else:
        pass

def spawn(self, x, y):
    spawnx = random.randint(50, x-50)
    spawny = random.randint(50, y 50)
    self.posx = spawnx
    self.posy = spawny
    self.spawned = True

def draw(self):
    pygame.draw.circle(screen, self.color, (self.posx, self.posy), 5, 0)
 

Это ловит меня на самой последней строке, касающейся использования pygame, определенного внутри моего определения ВНУТРИ моего класса. И да, код, вероятно, загроможден и полон бесполезных тривиальных битов, но на данный момент я просто хочу что-то, что хромает.

Я импортирую его следующим образом.

 from mutations import *
 

И с помощью простого вызова (программа даже не заходит так далеко, к вашему сведению.) после нескольких незначительных разделов кода.

 radiantregrowth = RadiantRegrowth()
 

Это первый вызов вторичного модуля. И, как я уже сказал; Программа останавливается, как только пытается импортировать дополнительный модуль mutations , из-за того, что он хочет, чтобы я снова импортировал pygame и снова настроил экран. Я НЕ собираюсь ничего Global создавать.

Извините за любую избыточность. Я стараюсь сделать это как можно более понятным.

Комментарии:

1. Если вы собираетесь задавать здесь много вопросов, вам, вероятно, следует узнать, как правильно делать отступы в коде Python в своих сообщениях.

Ответ №1:

Если код внутри вашего класса хочет вызывать функции из pygame, вам необходимо импортировать это имя в модуль, в котором оно находится. Это просто способ работы Python.

Однако вы не хотите настраивать новый screen экземпляр. Вместо этого вам, вероятно, следует передать его классу — либо непосредственно draw методу, либо самому классу при его инициализации, чтобы сохранить его как другой атрибут экземпляра и ссылаться на него внутри draw .

(И я считаю, что это pygame.draw.circle не pygame.circle.draw так.)

Комментарии:

1. Исправлен неправильный вызов метода рисования. Не могли бы вы быть немного более похожим на учебник? Я думаю, я понимаю, что вы говорите, но в любом случае вы могли бы использовать больше примеров?