2008-09-22 156 views
3

我正在尝试为游戏创建一个角色生成向导。在一个课堂上,我计算了角色的属性。在不同的课程中,我会根据角色的属性向用户展示哪些特色课程可用。但是,我不记得如何在不同的类之间传递变量。类之间的Python传递变量

这里是什么,我有一个例子:

class BasicInfoPage(wx.wizard.WizardPageSimple):    
    def __init__(self, parent, title): 
     wiz.WizardPageSimple.__init__(self, parent) 
     self.next = self.prev = None 
     self.sizer = makePageTitle(self, title) 

        <---snip---> 

     self.intelligence = self.genAttribs() 

class MOS(wx.wizard.WizardPageSimple): 
    def __init__(self, parent, title): 
     wiz.WizardPageSimple.__init__(self, parent) 
     self.next = self.prev = None 
     self.sizer = makePageTitle(self, title) 
     def eligibleMOS(self, event): 
      if self.intelligence >= 12: 
       self.MOS_list.append("Analyst") 

的问题是,我无法弄清楚如何使用“智能”变量从BasicInfoPage类的MOS类。我尝试了几种来自互联网的不同的东西,但似乎没有任何工作。我错过了什么?

编辑我意识到我张贴了这个,我没有解释得那么好。我试图创建一个1980年代的Twilight 2000 RPG的电脑版本。

我正在使用wxPython创建向导;我的类的父类是wxPython的向导。该向导将引导用户完成一个角色的创建,因此基本信息页面(BasicInfoPage类)允许用户提供角色的名称并为角色的属性“滚动”。这就是“self.intelligence”的来源。

我正尝试在向导中使用创建她的一个页面的属性,其中用户选择字符的特长。可用的专业取决于角色具有的属性,例如,如果情报足够高,角色可以是英特尔Anaylst。

我已经编程了好几年,尤其是面向对象的想法。这就是为什么我对如何使用类和方法创建实质上全局变量的困惑。

回答

6

您可能会将“Class”和“Instance”混淆。从你的例子中不清楚,所以我会假设你使用了很多类的定义,并没有这些类的适当的对象实例。

类实际上没有可用的属性值。一个类只是一组对象集合的通用定义。你应该把类看作定义,而不是实际的东西。

类的实例“对象”是具有实际属性值和执行方法功能的实际事物。

您不会在类别之间传递变量。你在实例之间传递变量。作为实际问题,只有实例变量很重要。 [是的,有类变量,但他们是一个相当专业的,往往令人困惑的事情,最好避免。]

当你创建一个对象(类的实例)

b= BasicInfoPage(...) 

然后b.intelligenceBasicInfoPageb实例的智能值。

一个非常普遍的事情是

class MOS(wx.wizard.PageSimple): 
    def __init__(self, parent, title, basicInfoPage): 
     <snip> 
     self.basicInfo= basicInfoPage 

现在,MOS方法中,你可以说self.basicInfo.intelligence因为MOS具有的对象是提供给它一个BasicInfoPage。

当你建立MOS时,你为它提供了它应该使用的BasicInfoPage的实例。现在

someBasicInfoPage= BasicInfoPage(...) 
m= MOS(..., someBasicInfoPage) 

,对象m可以检查someBasicInfoPage.intelligence

0

如果我理解正确,那么答案是:你不能。

智能应该是WizardPageSimple的一个属性,如果你想让这两个类继承它的话。

根据您的情况,您可能会尝试将智能和相关属性提取到另一个基类中。然后,你可以从两个继承:

class MOS(wiz.WizardPageSimple, wiz.IntelligenceAttributes): # Or something like that. 

在这种情况下,你必须使用合作社超。事实上,你应该已经使用它了。与其说

wiz.WizardPageSimple.__init__(self, parent) 

呼叫

super(MOS, self).__init__(self, parent) 
1

的所有你需要的是一个参考。这不是一个简单的问题,我可以给出一些单线解决方案(除了一个简单的丑陋的全局,可能会破坏别的东西),而是一个程序结构。您不会奇迹般地访问在另一个类的另一个实例上创建的变量。您必须将智能参考提供给MOS,或者从BasicInfoPage中获取,但可能会发生这种情况。在我看来,这些类的设计相当古怪 - 首先,信息页面不应该产生任何东西,如果是的话,它应该将它回馈给任何需要知道的东西 - 某种中心位置,它应该是首先产生它的人。通常,你会在那里设置变量,并从那里获取它们。或者至少,我会的。

如果你想要的“我怎么通过不同类之间的变量”的基本答案,那么在这里你走,但我怀疑这是你想要什么,你看可以用某种控制框架:

class Foo(object): 
    def __init__(self, var): 
     self.var = var 

class Bar(object): 
    def do_something(self, var): 
     print var*3 

if __name__ == '__main__': 
    f = Foo(3) 
    b = Bar() 
    # look, I'm using the variable from one instance in another! 
    b.do_something(f.var) 
3

向导的每一页 - 本身 - 而不是实际上应该为你收集信息的容器。

阅读Model-View-Control设计模式。您的页面具有设计的查看和控制部分。但是,它们不是数据模型。

如果您有一个由页面“构建”的单独对象,您会更高兴。每个页面将设置该基础模型对象的一些属性。然后,这些页面彼此独立,因为这些页面都获得并设置了该基础模型对象的值。

既然你正在构建一个角色,你有一些类这样

class Character(object): 
    def __init__(self): 
     self.intelligence= 10 
     <default values for all attributes.> 

那么你的各种向导实例只需要给予底层角色目标投入,并获得价值的地方。

2

我的问题确实是类与实例的混淆。我试图通过类来完成所有任务,而不需要创建实际的实例。另外,我迫使“BasicInfoPage”类做了太多工作。最终,我创建了一个新类(BaseAttribs)来容纳我需要的所有变量。然后我在这个类的实例创建当我运行该向导,并通过该实例作为参数传递给需要它的类,如下所示:

#---Run the wizard 
if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    wizard = wiz.Wizard(None, -1, "TW2K Character Creation") 
    attribs = BaseAttribs 

#---Create each page 
    page1 = IntroPage(wizard, "Introduction") 
    page2 = BasicInfoPage(wizard, "Basic Info", attribs) 
    page3 = Ethnicity(wizard, "Ethnicity") 
    page4 = MOS(wizard, "Military Occupational Specialty", attribs) 

我然后使用美国洛特提供的信息和创建的各个每个类中的实例(如果这就是所谓的)尽管每个类都访问相同的变量。

就我所知,一切正常。谢谢。