在另一个类中构造一个类

时间:2013-12-19 23:17:58

标签: python class python-3.x pygame

我正在开发我的游戏,并且已经创建了一个关卡类,但是我的parselevel()方法不会让我解析关卡,因为“Block”不是一个全局变量(Block是我的块类)。 / p>

我该怎么做?我可以将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

我的代码:

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()

1 个答案:

答案 0 :(得分:3)

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

  1. 由于level.py执行from entity import *entity必须在level之前加载;
  2. 由于entity.py执行from blocks import *blocks必须在entity之前加载;
  3. 由于blocks.py执行from level import *level必须在blocks之前加载。
  4. 显然这不起作用!

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

    但如果您遇到问题,可以通过打破圈子来解决问题,例如编写import level而不是from level import *。显然,你必须写level.foo而不是foo,但这应该很容易。

    (这可行,因为import foo尚未完成加载foo。)

    有关循环导入的详情,请参阅this entry in the Python FAQ