代码之家  ›  专栏  ›  技术社区  ›  crystalattice

Python在类之间传递变量

  •  3
  • crystalattice  · 技术社区  · 16 年前

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

    以下是我的一个例子:

    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")
    

    问题是我不知道如何将“intelligence”变量从BasicInfo类使用到MOS类。我在网上尝试了几种不同的方法,但似乎都不管用。我错过了什么?

    编辑 在我发布这篇文章后,我意识到我并没有很好地解释它。我正试图创建一个电脑版本的暮光2000 RPG从20世纪80年代。

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

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

    5 回复  |  直到 16 年前
        1
  •  7
  •   S.Lott    16 年前

    您可能混淆了“类”和“实例”。从您的示例中不清楚,所以我假设您使用了大量的类定义,并且没有这些类的适当对象实例。

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

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

    您不能在变量之间传递变量 . 您可以将变量传递给 实例

    创建对象(类的实例)时

    b= BasicInfoPage(...)
    

    b.intelligence 智力的价值是什么 b BasicInfoPage .

    一件非常普通的事情是

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

    现在,在MOS方法中,您可以说 self.basicInfo.intelligence

    当您构建MOS时,您为它提供了它应该使用的BasicInfo页面实例。

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

    现在,对象 m 可以检查 someBasicInfoPage.intelligence

        2
  •  4
  •   S.Lott    16 年前

    向导的每一页本身实际上不应该是您正在收集的信息的容器。

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

    既然你在塑造一个角色,你就会有这样的职业

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

    然后,您的各种向导实例只需要获得底层角色对象作为放置和获取值的位置。

        3
  •  2
  •   crystalattice    16 年前

    我的问题确实是类与实例的混淆。我试图通过类来完成所有事情,但从未创建过实际的实例。另外,我强迫“BasicInfoPage”类做太多的工作。

    最终,我创建了一个新类( 基本属性 )保存我需要的所有变量。然后,我在运行向导时创建了该类的实例,并将该实例作为参数传递给需要它的类,如下所示:

    #---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提供的信息,在每个类中创建了单独的实例(如果它被称为实例的话);不过,每个类都在访问相同的变量。

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

        4
  •  1
  •   Devin Jeanpierre    16 年前

    你所需要的只是一份推荐信。这并不是一个简单的问题,我可以给出一些单行的解决方案(除了一个可能会破坏其他东西的简单丑陋的全局),而是一个程序结构。您无法神奇地访问在另一个类的另一个实例上创建的变量。您必须要么将情报引用提供给MOS,要么从BasicInfo页面获取情报,但这可能会发生。在我看来,这些类的设计相当奇怪——首先,一个信息页面不应该生成任何东西,如果它生成了,它应该将它返回给需要知道的任何东西——某种中心位置,它应该首先生成它。通常,您会在那里设置变量,然后从那里获取它们。至少,我会的。

    如果你想得到“如何在不同类之间传递变量”的基本答案,那么你就来了,但我怀疑这正是你想要的,因为你似乎在使用某种控制框架:

    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)
    
        5
  •  0
  •   Antti Rasinen    16 年前

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

    如果希望两个类都继承它,那么智能应该是WizardPageSimple的一个属性。

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

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

    那样的话,你 必须

    wiz.WizardPageSimple.__init__(self, parent)
    

    呼叫

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