Python 在另一个类中构造一个类
我正在处理我的游戏,并且创建了一个级别类,但是我的parselevel()方法不允许我解析级别,因为“Block”不是一个全局变量(Block是我的Block类) 我该怎么做?我能把Block和Player传递给parseLevel方法吗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
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()