2013-12-22 30 views
1

我正在尝试让不同的“地点”类可以指向彼此的文本冒险。让两个类互相引用

例如,我有一个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++中我会设置在构造函数,它应该是我的字典了,它将使用Managerhomeclub成员的指针,因为我只希望每个地方的1个实例。我如何在Python中做到这一点?

编辑:扩展的代码示例

+0

你在这里模拟什么?为什么家有一个俱乐部的参考?经理的职责是什么? –

+0

当你玩游戏时,有一个主循环在当前位置上调用'display_plot_and_get_option'。然后它将结果传递给上面的'get_next_place'方法,该方法返回下一个地方。经理只是拥有地点和其他“全局”变量,如玩家的名字。 – CornSmith

+0

是否有必须拥有引用其他类的实例的管理器类? – thikonom

回答

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) 
+0

我认为这是python的最佳解决方案。也许最好不得不赶上回调并使用它(在本例中是在PLACES中),而不是引用指针。也许。谢谢 – CornSmith

+0

地方可能应该去经理类或通过__init__给它 – bcorso

1

假设HomeClub只是一对夫妇打算在你的游戏,包括很多地方的,它很可能是有利的,创建一个类Place。具体的类可以从Place继承,或者有一个名称作为数据成员。然后,您可以使用树或图建模连接。

+0

但是这会如何改善我所拥有的?我仍然需要经理,因为我只需要对每个类实例的引用。我仍然需要在方法中建立'places',这正是我想要解决的问题 – CornSmith

+1

'Home'和'Club'不需要彼此了解。你的'经理'可以有一个哈希表'{'home':['club'],'club':['home']}'',你可以从每个地方获取连接列表,而无需实际调用任何方法在'家'或'俱乐部'。 – ben4808

+0

我也玩过这个,但它看起来并不像刚才那样有可塑指针并引用那些东西。但我同意,这似乎是没有指针的最佳解决方案。 – CornSmith