Python在类之间传递变量

2024-05-21 01:38:39 发布

您现在位置: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类的“intelligence”变量。我在网上试过几种不同的方法,但似乎都没用。我错过了什么?

编辑我发了这篇文章后意识到,我没有解释得那么好。我正在尝试创建一个计算机版本的暮光2000从80年代的RPG

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

我正在尝试使用为向导中的下一页创建的属性,在该页中,用户选择角色的特性。可用的特性取决于字符的属性,例如,如果智能足够高,则该字符可以是Intel Anaylst。

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


Tags: 用户self角色属性titleinitdef字符
3条回答

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

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

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

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

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

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

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

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

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

之间不传递变量。在实例之间传递变量。实际上,只有实例变量才重要。[是的,有一些类变量,但它们是一个相当专业的、常常令人困惑的东西,最好避免。]

创建对象(类的实例)时

b= BasicInfoPage(...)

那么b.intelligenceBasicInfoPage实例的智能值。

一件很平常的事是

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

我的问题确实是类与实例的混淆。我试着通过类来做所有的事情,而没有创建一个实际的实例。另外,我强迫“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提供的信息,并在每个类中创建单独的实例(如果这就是所谓的实例);但是每个类都访问相同的变量。

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

相关问题 更多 >