3

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

这是我所拥有的一个例子:

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”的来源。

我正在尝试将她创建的属性用于向导中进一步的页面,用户可以在其中选择角色的专业。可用的专长取决于角色的属性,例如,如果智力足够高,则角色可以是 Intel Anaylst。

自从我编程以来已经有好几年了,尤其是在 OOP 的想法方面。这就是为什么我对如何使用类和方法创建本质上是全局变量的东西感到困惑。

4

5 回答 5

7

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

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

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

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

创建对象(类的实例)时

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

于 2008-09-22T10:12:50.783 回答
4

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

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

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

既然你正在构建一个角色,你就会有这样的课程

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

然后你的各种 Wizard 实例只需要被赋予底层 Character 对象作为放置和获取值的地方。

于 2008-09-22T10:18:04.687 回答
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 提供的信息并在每个类中创建了单独的实例(如果这就是它的名称);但是,每个类都在访问相同的变量。

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

于 2008-09-23T09:48:59.430 回答
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)
于 2008-09-22T06:05:58.677 回答
0

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

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

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

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

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

wiz.WizardPageSimple.__init__(self, parent)

称呼

super(MOS, self).__init__(self, parent)
于 2008-09-22T05:59:28.147 回答