我有一个任务需要你完成,使用
现在,在
然而,这会创建循环导入,正如其他帖子中所描述的那样。有人说循环导入是指示不良设计的标志,并且应该进行重构。
我知道我只需在需要使用它之前导入
现在我想知道…您如何重新构造它?谢谢。
编辑: Pydsigner建议我将两个文件合并为一个,因为它们都与彼此非常相关。但是,我不能将每个具有循环依赖关系的状态都放入一个文件中,因此必须有更好的方法。有什么想法吗?
2次编辑: 我通过不使用
代码:
engine.setState(<state class>)
可以实例化给定的类,并在新状态下开始运行。在SelectFileState
中有一个按钮可以转到NewFileState
,在NewFileState
中也有一个按钮可以回到SelectFileState
。现在,在
SelectFileState
的开头,我正在导入NewFileState
(以便稍后在类中执行engine.setState(NewFileState)
)。在NewFileState
的开头,我也正在导入SelectFileState
(以便稍后返回SelectFileState
)。然而,这会创建循环导入,正如其他帖子中所描述的那样。有人说循环导入是指示不良设计的标志,并且应该进行重构。
我知道我只需在需要使用它之前导入
SelectFileState
即可解决此问题,但我宁愿以正确的方式重构它。现在我想知道…您如何重新构造它?谢谢。
编辑: Pydsigner建议我将两个文件合并为一个,因为它们都与彼此非常相关。但是,我不能将每个具有循环依赖关系的状态都放入一个文件中,因此必须有更好的方法。有什么想法吗?
2次编辑: 我通过不使用
from x import y
语法来规避此问题,而是直接执行import x
。这不是一个理想的解决方案,我想知道修复这种问题的“Pythonic”方法。只是合并文件不能永远成为解决方法。代码:
from states.state import State
from states.newfilestate import NewFileState
from elements.poster import Poster
from elements.label import Label
from elements.button import Button
from elements.trifader import TriFader
import glob
import os
class SelectFileState(State):
def __init__(self, engine):
super().__init__(engine)
def create(self):
self.engine.createElement((0, 0), Poster(self.engine.getImage('gui_loadsave')), 1)
self.engine.createElement((168, 30), Label("Load a game", 40), 2)
self.engine.createElement((400, 470), Button("New save", code=self.engine.createElement, args=((0, 0), TriFader(NewFileState, False), -240)), 3)
ycounter = 150
globs = glob.glob("save\\*.mcw")
for file in globs:
self.engine.createElement((200, ycounter), Button(os.path.basename(file)[:-4]), 2)
ycounter += 50
NewFileState
from states.state import State
from states.selectfilestate import SelectFileState
from elements.poster import Poster
from elements.label import Label
from elements.button import Button
from elements.inputbox import InputBox
from elements.trifader import TriFader
class NewFileState(State):
def __init__(self, engine):
super().__init__(engine)
def create(self):
self.engine.createElement((0, 0), Poster(self.engine.getImage('gui_loadsave')), 1)
self.engine.createElement((135, 30), Label("Make a new save", 40), 2)
self.lvlname = self.engine.createElement((180, 212), InputBox(length=25, text="World name"), 2)
self.engine.createElement((200, 240), Button(text="Ok", code=self.createSave, args=()), 2)
def createSave(self):
open("save\\" + self.lvlname.getText() + ".mcw", 'w')
self.engine.createElement((0, 0), TriFader(SelectFileState), -240)
__init__
方法执行重要任务,例如与引擎进行交互并设置一些变量。 - Name McChange