从模块导入并避免重复导入/变量

0 投票
1 回答
914 浏览
提问于 2025-04-18 11:11

我又一次来到这里,急切地寻求答案 :)

我在使用Python时遇到了一个关于导入的问题。我有一个主程序,它需要导入一个只包含一个类的辅助模块。我想直接使用这个类,而不想再导入辅助模块里的其他东西。然而,Python却告诉我有些东西不存在等等。

  File "C:\Users\CR0SS0V3R\Desktop\Pathogen\mutations.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 个回答

1

如果你在自己的类里面想要调用pygame的函数,你需要在这个类所在的模块里导入pygame。这就是Python的工作方式。

不过,你不需要再创建一个新的screen实例。相反,你应该把它传递给这个类——可以直接传给draw方法,或者在初始化这个类的时候传进去,这样你就可以把它存储为另一个实例属性,然后在draw方法里使用它。

(我记得应该是pygame.draw.circle,而不是pygame.circle.draw。)

撰写回答