让两个类互相引用

时间:2013-12-22 04:37:28

标签: python oop

我正在尝试进行文本冒险,其中不同的“地方”类可以指向彼此。

例如,我有一个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中做到这一点?

修改:扩展代码示例

2 个答案:

答案 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)

假设HomeClub只是您计划在游戏中包含的众多地方中的几个,那么创建Place类可能会有所帮助。特定类可以从Place继承,也可以将名称作为数据成员。然后,您可以使用树或图形建模连接。