我正在尝试为游戏创建角色生成向导。在一个班级中,我计算角色的属性。在另一个类中,我将根据角色的属性向用户显示哪些专业可用。但是,我不记得如何在不同的类之间传递变量。
以下是我的例子:
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类。我在互联网上尝试过几种不同的东西但似乎没什么用。我错过了什么?
编辑我在发布之后意识到我没有那么好解释。我正试图从20世纪80年代创建一个计算机版本的Twilight 2000 RPG。
我正在使用wxPython来创建向导;我的类的父类是来自wxPython的向导。该向导将引导用户创建一个字符,因此“基本信息”页面(类BasicInfoPage)允许用户为角色的属性提供角色的名称和“滚动”。这就是“自我智能”的来源。
我正在尝试在向导中使用为她的页面创建的属性,用户可以在其中选择角色的特性。可用的专业取决于角色所具有的属性,例如如果智力足够高,角色可以是英特尔Anaylst。
我编程已经好几年了,特别是有了OOP的想法。这就是为什么我对如何用类和方法创建本质上是全局变量感到困惑。
答案 0 :(得分:6)
您可能将“类”和“实例”混淆了。从你的例子中不清楚,所以我假设你使用了很多类定义而没有这些类的适当对象实例。
类实际上没有可用的属性值。类只是对象集合的一组通用定义。您应该将类视为定义,而不是实际的事物。
类的实例,“对象”,是具有实际属性值和执行方法函数的实际事物。
您不在类之间传递变量。您在实例之间传递变量。实际上,只有实例变量很重要。 [是的,有类变量,但它们是一个相当专业且经常令人困惑的事情,最好避免。]
创建对象(类的实例)时
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
答案 1 :(得分:3)
向导的每个页面 - 本身 - 实际上不应该是您收集的信息的容器。
阅读Model-View-Control设计模式。您的页面具有设计的视图和控件部分。但是,它们不是数据模型。
如果您有一个由页面“构建”的单独对象,您会更高兴。每个页面都将设置该底层模型对象的一些属性。然后,页面彼此独立,因为页面都获取并设置了此底层模型对象的值。
因为你正在构建一个角色,所以你会有一些像这样的课程
class Character( object ):
def __init__( self ):
self.intelligence= 10
<default values for all attributes.>
然后,您需要为各种向导实例提供基础角色对象作为放置和获取值的位置。
答案 2 :(得分: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提供的信息,并在每个类中创建了各个实例(如果这就是它的名称);每个类都访问相同的变量。
据我所知,一切正常。感谢。
答案 3 :(得分: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)
答案 4 :(得分:0)
如果我理解正确,那么答案是:你不能。
智能应该是WizardPageSimple的一个属性,如果你想让两个类都继承它。
根据您的具体情况,您可能会尝试将智能和相关属性提取到另一个基类中。然后你可以继承:
class MOS(wiz.WizardPageSimple, wiz.IntelligenceAttributes): # Or something like that.
在这种情况下,您必须使用合作超级。事实上,你应该已经使用它了。而不是打电话
wiz.WizardPageSimple.__init__(self, parent)
呼叫
super(MOS, self).__init__(self, parent)