Python-在类之间传递变量
我正在为一个游戏创建一个角色生成向导。在一个类里,我计算角色的属性。在另一个类里,我根据角色的属性向用户展示可用的特长。不过,我记不起来怎么在不同的类之间传递变量。
下面是我现在的代码示例:
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类里的“intelligence”变量传到MOS类里。我在网上尝试了几种不同的方法,但都没有成功。我到底漏掉了什么呢?
编辑 我在发帖后意识到我没有解释清楚。我想创建一个1980年代的《暮光2000》角色扮演游戏的电脑版本。
我正在使用wxPython来创建这个向导;我的类的父类是wxPython里的Wizard。这个向导会引导用户创建角色,所以基本信息页面(BasicInfoPage类)让用户输入角色的名字并“掷骰子”来决定角色的属性。这就是“self.intelligence”变量的来源。
我想在向导的后续页面使用这里创建的属性,用户可以在那选择角色的特长。可用的特长取决于角色的属性,比如如果智力足够高,角色就可以成为情报分析员。
我已经有好几年没编程了,尤其是面向对象编程的概念。所以我对如何用类和方法创建一个类似全局变量的东西感到困惑。
5 个回答
我遇到的问题其实是搞混了类和实例的概念。我一直试图通过类来完成所有事情,但从来没有创建过实际的实例。而且,我还让“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提供的信息,在每个类里面创建了单独的实例(如果这样叫的话);不过每个类都在访问同样的变量。
目前来看,一切都正常,谢谢。
每个向导的页面本身其实不应该是你收集信息的容器。
可以了解一下 模型-视图-控制器 这种设计模式。你的页面属于这个设计中的视图和控制部分,但它们并不是数据模型。
如果你有一个单独的对象来“构建”这些页面会更好。每个页面会设置这个基础模型对象的一些属性。这样一来,页面之间就可以独立,因为它们都是在获取和设置这个基础模型对象的值。
既然你是在创建一个角色,你可以有一个这样的类:
class Character( object ):
def __init__( self ):
self.intelligence= 10
<default values for all attributes.>
然后你的各种向导实例只需要把这个基础角色对象提供给它们,这样就可以用来存放和获取值了。
你可能对“类”和“实例”有些混淆。从你的例子来看,我猜测你使用了很多类的定义,但没有适当地创建这些类的对象实例。
类本身并没有可以直接使用的属性值。类只是一个定义的集合,用来描述一组对象。你可以把类看作是一种定义,而不是实际存在的东西。
类的实例,也就是“对象”,才是真正的东西,它们有实际的属性值,并且可以执行方法功能。
你不是在类之间传递变量,而是在实例之间传递变量。实际上,只有实例变量才是重要的。[是的,确实有类变量,但它们比较特殊,常常让人困惑,最好避免使用。]
当你创建一个对象(也就是一个类的实例)时,
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
。