题
我试图创造一个角色产生的向导一场游戏。在一个类计算的属性的角色。在一个不同的类,我向用户显示其特色是提供基于属性的角色。然而,我可不记得怎么通过变量之间不同的类别。
这里是一个例子是我有:
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)