我试图创建一个游戏中的角色生成向导。 在一类我计算出角色的属性。 在不同的班级,我显示,其特色是提供基于角色的属性的用户。 但是,我不记得如何将不同类之间传递变量。
这里是什么,我有一个例子:
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年代的黄昏2000 RPG的电脑版。
我使用wxPython的创建向导; 父类的我的班是从wxPython的向导。 这向导将引导用户通过创建一个角色,所以基本信息页面(类BasicInfoPage)让用户给角色的名字和“滚”,为角色的属性。 这也正是“self.intelligence”的由来。
我想进一步上使用的属性造就了她的页面向导,其中用户选择字符的特殊性。 可用的特色取决于性格也,例如,如果智力足够高,字符可以是英特尔Anaylst的属性。
它已经好几年,因为我已经程序化,尤其是面向对象的思想。 这就是为什么我在如何创建有什么本质上与类和方法的全局变量混淆。
Answer 1:
你可能有“类”和“实例”糊涂。 这不是从你的例子清晰,所以我假定你使用了大量的类定义的,不具备这些类的合适的对象实例。
班真的没有可用的属性值。 一类是只为对象的集合一套共同的定义。 你应该想到的类作为定义,而不是实际的东西。
的类的实例,“物”,是具有实际的属性值和执行方法的功能实际的东西。
你不及格类中的变量。 您通过实例之间的变量。 作为一个实际问题唯一的实例变量关系。 [是的,有类变量,但他们是一个相当专业的,往往令人困惑的事情,最好避免。]
当你创建一个对象(类的实例)
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
Answer 2:
一个向导的每一页 - 本身 - 而不是实际上应该为你收集信息的容器。
阅读上的模型-视图-控制器设计模式。 您的网页已设计的查看和控制部件。 他们不是数据模型,但是。
如果您有一个“内置”的页面一个单独的对象,你会更快乐。 每个页面将设置底层的模型对象的某些属性。 然后,网页是相互独立的,因为页面的所有get和set这个底层模型对象的值。
既然你正在构建一个角色,你有一些类这样
class Character( object ):
def __init__( self ):
self.intelligence= 10
<default values for all attributes.>
然后你的各种向导实例只需要给予底层角色目标投入,并获得价值的地方。
Answer 3:
我的问题是确实的类的实例与混乱。 我试图通过类来所做的一切而没有产生实际的实例。 另外,我被强迫“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)
然后我用美国洛特提供的信息,并创建单个实例(如果这就是它叫什么)每类中; 每类的,虽然访问相同的变量。
一切正常,至于我可以告诉。 谢谢。
Answer 4:
所有你需要的是一个参考。 这不是一个真正的简单的问题,我可以给一些单行的解决方案(而不是一个简单的丑陋的全球性,可能会导致其他问题等),但程序结构之一。 你不会奇迹般地获得访问这是另一个类的其他实例创建的变量。 你必须要么放弃智能参考MOS,或把它从BasicInfoPage,但是那可能发生的事情。 在我看来,这些类的设计,而oddly--信息页面,一方面,应该不会产生任何东西,如果这样做,就应该把它还给任何需要知道 - 某种形式的中心位置,这本来应该是一个摆在首位生成它。 通常情况下,你会设置的变量在那里,并从那里得到他们。 或者至少,我会的。
如果你想的基本答案“我如何通过不同类之间的变量”,然后在这里你走了,但我怀疑这是你想要什么,你看可以用某种控制框架:
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)
Answer 5:
如果我理解正确的话,那么答案是:不能。
智力应该是WizardPageSimple的属性,如果你想要这两个类继承它。
根据您的情况,您可以尝试提取情报和相关属性到另一个基类。 然后,你可以从两个继承:
class MOS(wiz.WizardPageSimple, wiz.IntelligenceAttributes): # Or something like that.
在这种情况下,你必须使用合作社超。 事实上,你应该已经在使用它。 而不是调用的
wiz.WizardPageSimple.__init__(self, parent)
呼叫
super(MOS, self).__init__(self, parent)
文章来源: Python-passing variable between classes