我正在尝试进行文本冒险,其中不同的“地方”类可以指向彼此。
例如,我有一个Manager
类,它引用了每个地方。然后我有一个Home
类和一个Club
类,通过管理器引用彼此。问题是由于循环引用,我无法实例化它们。
以下是我如何解决它,但它很难看,因为我必须在方法中创建places
成员而不是__init__
。
class Manager:
def __init__(self):
self.home = Home(self)
self.club = Club(self)
class Home:
def __init__(self, manager):
self.places = {}
self.manager = manager
def display_plot_and_get_option (self):
print "where do you want to go?"
return 'club' #get this from user
def get_next_place(self, place_name):
self.places = { #THIS IS THE BAD PART, which should be in __init__ but can't
'home':self.manaer.home
'club':self.manaer.club }
return self.places[place_name]
class Club:
#similar code to Home
pass
manager = Manager()
while (True):
place_name = manager.current_place.display_plot_and_get_option()
manager.current_place = manager.current_place.get_next_place(place_name)
在c ++中,我会在构造函数中设置我的dict,它应该是,它会使用Manager
的{{1}}或home
成员的指针,因为我只想要每个地方的1个实例。我怎么能在python中做到这一点?
修改:扩展代码示例
答案 0 :(得分:2)
您可以拥有一个包含引用的字典,并直接从Manager(实际上不应该命名为Manager,因为它现在不能用于此目的)实例调用方法。
class Home(object):
pass
class Club(object):
pass
PLACES = {
'home': Home(),
'club': Club()
}
class Manager(object):
def display_plot_and_get_option(self):
return raw_input('Where do you want to go?')
def get_next_place(self, place_name):
return PLACES[place_name]
m = Manager()
while 1:
place_name = m.display_plot_and_get_option()
m.get_next_place(place_name)
答案 1 :(得分:1)
假设Home
和Club
只是您计划在游戏中包含的众多地方中的几个,那么创建Place
类可能会有所帮助。特定类可以从Place
继承,也可以将名称作为数据成员。然后,您可以使用树或图形建模连接。