Python-在类之间传递变量

3 投票
5 回答
24176 浏览
提问于 2025-04-11 09:24

我正在为一个游戏创建一个角色生成向导。在一个类里,我计算角色的属性。在另一个类里,我根据角色的属性向用户展示可用的特长。不过,我记不起来怎么在不同的类之间传递变量。

下面是我现在的代码示例:

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类里的“intelligence”变量传到MOS类里。我在网上尝试了几种不同的方法,但都没有成功。我到底漏掉了什么呢?

编辑 我在发帖后意识到我没有解释清楚。我想创建一个1980年代的《暮光2000》角色扮演游戏的电脑版本。

我正在使用wxPython来创建这个向导;我的类的父类是wxPython里的Wizard。这个向导会引导用户创建角色,所以基本信息页面(BasicInfoPage类)让用户输入角色的名字并“掷骰子”来决定角色的属性。这就是“self.intelligence”变量的来源。

我想在向导的后续页面使用这里创建的属性,用户可以在那选择角色的特长。可用的特长取决于角色的属性,比如如果智力足够高,角色就可以成为情报分析员。

我已经有好几年没编程了,尤其是面向对象编程的概念。所以我对如何用类和方法创建一个类似全局变量的东西感到困惑。

5 个回答

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提供的信息,在每个类里面创建了单独的实例(如果这样叫的话);不过每个类都在访问同样的变量。

目前来看,一切都正常,谢谢。

4

每个向导的页面本身其实不应该是你收集信息的容器。

可以了解一下 模型-视图-控制器 这种设计模式。你的页面属于这个设计中的视图和控制部分,但它们并不是数据模型。

如果你有一个单独的对象来“构建”这些页面会更好。每个页面会设置这个基础模型对象的一些属性。这样一来,页面之间就可以独立,因为它们都是在获取和设置这个基础模型对象的值。

既然你是在创建一个角色,你可以有一个这样的类:

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

然后你的各种向导实例只需要把这个基础角色对象提供给它们,这样就可以用来存放和获取值了。

8

你可能对“类”和“实例”有些混淆。从你的例子来看,我猜测你使用了很多类的定义,但没有适当地创建这些类的对象实例。

类本身并没有可以直接使用的属性值。类只是一个定义的集合,用来描述一组对象。你可以把类看作是一种定义,而不是实际存在的东西。

类的实例,也就是“对象”,才是真正的东西,它们有实际的属性值,并且可以执行方法功能。

你不是在类之间传递变量,而是在实例之间传递变量。实际上,只有实例变量才是重要的。[是的,确实有类变量,但它们比较特殊,常常让人困惑,最好避免使用。]

当你创建一个对象(也就是一个类的实例)时,

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有一个可用的 BasicInfoPage 对象。

当你构建MOS时,你需要提供它应该使用的 BasicInfoPage 的实例。

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

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

撰写回答