我有一个可以执行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”方法。仅仅将文件合并在一起并不是永远的解决办法。
编码:
SelectFileState
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)
最佳答案
如果不看代码,最有意义的就是合并两个文件。如果它们是如此紧密地交织在一起,那么您可能会把它们放在一起而没有任何奇怪的地方。