Python在类之间传递变量

时间:2008-09-22 05:49:01

标签: python oop variables wxpython

我正在尝试为游戏创建角色生成向导。在一个班级中,我计算角色的属性。在另一个类中,我将根据角色的属性向用户显示哪些专业可用。但是,我不记得如何在不同的类之间传递变量。

以下是我的例子:

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类。我在互联网上尝试过几种不同的东西但似乎没什么用。我错过了什么?

编辑我在发布之后意识到我没有那么好解释。我正试图从20世纪80年代创建一个计算机版本的Twilight 2000 RPG。

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

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

我编程已经好几年了,特别是有了OOP的想法。这就是为什么我对如何用类和方法创建本质上是全局变量感到困惑。

5 个答案:

答案 0 :(得分:6)

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

类实际上没有可用的属性值。类只是对象集合的一组通用定义。您应该将类​​视为定义,而不是实际的事物。

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

您不在之间传递变量。您在实例之间传递变量。实际上,只有实例变量很重要。 [是的,有类变量,但它们是一个相当专业且经常令人困惑的事情,最好避免。]

创建对象(类的实例)时

b= BasicInfoPage(...)

然后b.intelligenceb BasicInfoPage实例的情报值。

一个非常普遍的事情是

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

答案 1 :(得分:3)

向导的每个页面 - 本身 - 实际上不应该是您收集的信息的容器。

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

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

因为你正在构建一个角色,所以你会有一些像这样的课程

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

然后,您需要为各种向导实例提供基础角色对象作为放置和获取值的位置。

答案 2 :(得分: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)

然后,我使用了S.Lott提供的信息,并在每个类中创建了各个实例(如果这就是它的名称);每个类都访问相同的变量。

据我所知,一切正常。感谢。

答案 3 :(得分: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)

答案 4 :(得分:0)

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

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

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

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

在这种情况下,您必须使用合作超级。事实上,你应该已经使用它了。而不是打电话

wiz.WizardPageSimple.__init__(self, parent)

呼叫

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