我试图创造一个角色产生的向导一场游戏。在一个类计算的属性的角色。在一个不同的类,我向用户显示其特色是提供基于属性的角色。然而,我可不记得怎么通过变量之间不同的类别。

这里是一个例子是我有:

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类。我已经尝试了几种不同的东西从互联网,但似乎没有任何工作。我是什么丢失?

编辑 我意识到之后,我发表这个,我没有解释它。我试图建立一个计算机版本的黄昏2000年RPG从1980年代。

我使用的wxPython创建一个向导;父类的我的课程是向导wxPython.这导将步行一个用户通过设立一个字,这样的基本信息的网页(类BasicInfoPage)使用户得到角色的名字和"滚动"的性质的属性。这就是"自我。情报"。

我尝试使用特性创造了她一页进一步的向导,其中的用户选择专业的角色。的特色菜是可依赖性的角色有,例如如果情报不够高,字可能是一个英特尔Anaylst.

它已经几年了,因为我们编程,特别是面向对象的观念。这就是为什么我很困惑,对如何创建有什么本质上是一个全球性的变量与类和方法。

有帮助吗?

解决方案

你可能会有"类"和"实例"相混淆。它不清楚从你的实例,因此我相信,你使用了很多类定义并没有适当的对象的实例,这些类。

课程不是真的有用的特性的值。一类是仅仅一套共同的定义收集的对象。你应该想的类,因为定义,而不是实际的东西。

类的实例,"对象",实际的事情,实际属性的价值观和执行方法的功能。

你不能通过变量之中 .你通过变量之中 实例.作为一个实际问题唯一的实例变量的问题。[是的,有些类变量,但他们是一个相当专门和常常令人混淆的事情,最好避免。]

当你创建的一个目(一个实例一类)

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

其他提示

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

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

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

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

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

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

我的问题确实是类与实例的混淆。我试图通过类来做所有事情,而不是创建一个实际的实例。另外,我正在强制使用“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提供的信息,并在每个类中创建了各个实例(如果这就是它的名称);每个类都访问相同的变量。

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

您需要的只是一个参考。这不是一个简单的问题,我可以提供一些单行解决方案(除了一个简单的丑陋的全局,可能会破坏别的东西),但程序结构之一。您不会神奇地访问在另一个类的另一个实例上创建的变量。您必须向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)

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

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

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

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

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

wiz.WizardPageSimple.__init__(self, parent)

呼叫

super(MOS, self).__init__(self, parent)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top