Python 在另一个类中构造一个类

Python 在另一个类中构造一个类,python,class,python-3.x,pygame,Python,Class,Python 3.x,Pygame,我正在处理我的游戏,并且创建了一个级别类,但是我的parselevel()方法不允许我解析级别,因为“Block”不是一个全局变量(Block是我的Block类) 我该怎么做?我能把Block和Player传递给parseLevel方法吗 Traceback (most recent call last): File "C:\Users\Benjamin\Documents\GitHub\ShipGame\level.py", line 3, in <module> fr

我正在处理我的游戏,并且创建了一个级别类,但是我的parselevel()方法不允许我解析级别,因为“Block”不是一个全局变量(Block是我的Block类)

我该怎么做?我能把Block和Player传递给parseLevel方法吗

Traceback (most recent call last):
  File "C:\Users\Benjamin\Documents\GitHub\ShipGame\level.py", line 3, in <module>
    from entity import *
  File "C:\Users\Benjamin\Documents\GitHub\ShipGame\entity.py", line 5, in <module>
    from blocks import *
  File "C:\Users\Benjamin\Documents\GitHub\ShipGame\blocks.py", line 4, in <module>
    from level import *
  File "C:\Users\Benjamin\Documents\GitHub\ShipGame\level.py", line 4, in <module>
    from blocks import Block
ImportError: cannot import name Block

回溯显示存在循环导入问题。当您拥有来自foo import*的语句
时,Python必须立即完成加载
foo
(以便它能够计算出所有导入的名称)。但这意味着:

  • 由于
    level.py
    从实体导入执行
    *
    ,因此必须在
    level
    之前加载
    实体
  • 由于
    entity.py
    从块导入执行
    块必须在
    entity
    之前加载
  • 由于
    blocks.py
    从级别导入执行
    *
    ,因此必须在
    blocks
    之前加载
    level
  • 显然,这是行不通的

    您真正应该做的是重新组织代码,这样每个模块就不需要了解所有其他模块。(例如,为什么
    需要了解
    级别
    ?)

    但是,如果您在这方面遇到困难,您可以通过打破循环来实现,例如编写
    import-level
    ,而不是从level-import*
    编写
    。显然,您必须编写
    level.foo
    ,而不是
    foo
    ,但这应该很容易

    (这是因为
    import foo
    不需要
    foo
    就可以完成加载。)


    有关循环导入的更多信息,请参阅。

    是否与
    级别
    位于同一文件中的
    端口
    ??我猜它们是用
    从实体导入*
    从块导入*
    导入的,对吗?@jramirez你说得对,它们是从blocks.py文件导入的。谢谢!我不明白为什么区块需要知道关卡,所以我删除了它,我也将使用从玩家导入玩家,这样我就不必初始化所有东西,在这一点上,从玩家导入玩家
    必须完成加载
    玩家
    模块(以便定义
    玩家
    类),因此,这也可能导致循环进口。
    
    import pygame
    
    from entity import *
    from blocks import *
    
    # Holds the level layout in a list of strings.
    levelMap = [
    "WWWWWWWWWWWWWWWWWWWW",
    "WX                 W",
    "W                  W",
    "W             P    W",
    "W                  W",
    "W                  W",
    "W                  W",
    "W                  W",
    "W                  W",
    "W                  W",
    "W                  W",
    "W                  W",
    "W   P              W",
    "W                  W",
    "WWWWWWWWWWWWWWWWWWWW",
    ]
    
    class Level(object):
    
        def __init__(self, levelMap):
            self.levelMap = levelMap
    
        def parseLevel(self):
            x = 144
            y = 0
            for row in self.levelMap:
                for col in row:
                    if col == "W":
                        Block((x, y))
                    if col =="P":
                        Port((x, y))
                    if col == "X":
                        player = Player((x, y), 1, "Player1", 1, 0)
                    x += 32
                y += 32
                x = 144
    
    level = Level(levelMap)
    level.parseLevel()