2010-02-24 52 views
8

假设我有三个类的系统。 GameClass在初始化时创建其他两个类的实例。Python OOP - 类关系

class FieldClass: 
    def __init__(self): 
     return 
    def AnswerAQuestion(self):  
     return 42 

class PlayerClass: 
    def __init__(self): 
     return 
    def DoMagicHere(self): 
     # Access "AnswerAQuestion" located in the "FieldClass" instance in "GameClass" 
     pass 

class GameClass: 
    def __init__(self): 
     self.Field = FieldClass() 
     self.Player = PlayerClass() 

什么是访问AnswerAQuestion()位于FieldClassPlayerClass实例中的最佳方式是什么?

  • 是否必须将对FieldClass实例的引用传递给PlayerClass
  • 有没有解决这个问题的另一种更好的方法?这样做会使我必须在PlayerClass中包含一个额外的变量来保存FieldClass实例。
  • 在Python中是否有完全不同的管理类关系的方法?

回答

6

我会去与Dependency Injection:发起与GameClass所需的构造函数调用等FieldClassPlayerClass(即,而不是创建从GameClass内,你此刻在做相关的对象)。

class GameClass: 
    def __init__(self, fc, pc): 
     self.Field = fc 
     self.Player = pc 

class PlayerClass: 
    def __init__(self, fc): 
     self.fc = fc 

    def DoMagicHere(self): 
     # use self.fc 
     pass 

fc=FieldClass() 
pc=PlayerClass(fc) 
gc=GameClass(fc, pc) 

使用DI,一旦安装阶段完成后,您可以轻松访问所需的成员。

4

为了更好地了解你的班级关系,你必须告诉我们更多关于你的项目和你想要完成的事情。到在你的例子从PlayerClass引用实例的FieldClass

的一种方式是在GameClass实例传递给PlayerClass实例:

class PlayerClass: 
    def __init__(self, game): 
     self.game = game 
    def DoMagicHere(self): 
     self.game.Field.AnswerAQuestion() 

# ... 

class GameClass: 
    def __init__(self): 
     self.Field = FieldClass() 
     self.Player = PlayerClass(self) 

另一种方式是通过field可变

class PlayerClass: 
    def __init__(self, field): 
     self.field = field 
    def DoMagicHere(self): 
     self.field.AnswerAQuestion() 
# ... 

class GameClass: 
    def __init__(self): 
     self.Field = FieldClass() 
     self.Player = PlayerClass(self.Field) 

附注:您使用一种特殊的命名方案。我建议这样:

class Game: 
    def __init__(self): 
     self.field = Field() 
     self.player = Player(...) 

我建议你在读取坏习惯之前阅读Python Style Guide

+0

感谢有关命名方案问题 – lamas 2010-02-24 17:47:05

+1

+1的信息,以改进类名的建议。 – 2010-02-24 17:47:41

0

我会做类似以下的事情,在那里你将Game作为后向引用传递给你,允许你访问其他相关的类。通过这种方式,您可以选择为该玩家实例提供与该字段的直接关系。

class FieldClass(object): 
    def __init__(self, game): 
     self.Game = game 
    def AnswerAQuestion(self):  
     return 42 

class PlayerClass(object): 
    def __init__(self, game): 
     self.Game = game 
     self.Field = game.Field # Optional 
    def DoMagicHere(self): 
     self.Game.Field.AnswerAQuestion() 
     self.Field.AnswerAQuestion() # Optional 

class GameClass(object): 
    def __init__(self): 
     self.Field = FieldClass(self) 
     self.Player = PlayerClass(self) 

一边注意的是,它是很好的做法,现在有你所有的类都是从object继承,而不是让他们独自站立。

1

你可以提供上下文的子对象,即:

class FieldClass: 
    def __init__(self,game): 
    self.game = game 

class PlayerClass: 
    def __init__(self,game): 
    self.game = game 
    def DoMagicHere(self): 
    self.game.Field.AnswerAQuestion() 

class GameClass: 
    def __init__(self): 
    self.Field = FieldClass(self) 
    self.Player = PlayerClass(self) 

由于对象知道他们的背景下,他们能够到达在同一背景下,并访问其他对象。