2008-09-22 134 views
3

我正在嘗試爲遊戲創建一個角色生成嚮導。在一個課堂上,我計算了角色的屬性。在不同的課程中,我會根據角色的屬性向用戶展示哪些特色課程可用。但是,我不記得如何在不同的類之間傳遞變量。類之間的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類的MOS類。我嘗試了幾種來自互聯網的不同的東西,但似乎沒有任何工作。我錯過了什麼?

編輯我意識到我張貼了這個,我沒有解釋得那麼好。我試圖創建一個1980年代的Twilight 2000 RPG的電腦版本。

我正在使用wxPython創建嚮導;我的類的父類是wxPython的嚮導。該向導將引導用戶完成一個角色的創建,因此基本信息頁面(BasicInfoPage類)允許用戶提供角色的名稱併爲角色的屬性「滾動」。這就是「self.intelligence」的來源。

我正嘗試在嚮導中使用創建她的一個頁面的屬性,其中用戶選擇字符的特長。可用的專業取決於角色具有的屬性,例如,如果情報足夠高,角色可以是英特爾Anaylst。

我已經編程了好幾年,尤其是面向對象的想法。這就是爲什麼我對如何使用類和方法創建實質上全局變量的困惑。

回答

6

您可能會將「Class」和「Instance」混淆。從你的例子中不清楚,所以我會假設你使用了很多類的定義,並沒有這些類的適當的對象實例。

類實際上沒有可用的屬性值。一個類只是一組對象集合的通用定義。你應該把類看作定義,而不是實際的東西。

類的實例「對象」是具有實際屬性值和執行方法功能的實際事物。

您不會在類別之間傳遞變量。你在實例之間傳遞變量。作爲實際問題,只有實例變量很重要。 [是的,有類變量,但他們是一個相當專業的,往往令人困惑的事情,最好避免。]

當你創建一個對象(類的實例)

b= BasicInfoPage(...) 

然後b.intelligenceBasicInfoPageb實例的智能值。

一個非常普遍的事情是

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

0

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

智能應該是WizardPageSimple的一個屬性,如果你想讓這兩個類繼承它的話。

根據您的情況,您可能會嘗試將智能和相關屬性提取到另一個基類中。然後,你可以從兩個繼承:

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

在這種情況下,你必須使用合作社超。事實上,你應該已經使用它了。與其說

wiz.WizardPageSimple.__init__(self, parent) 

呼叫

super(MOS, self).__init__(self, parent) 
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) 
3

嚮導的每一頁 - 本身 - 而不是實際上應該爲你收集信息的容器。

閱讀Model-View-Control設計模式。您的頁面具有設計的查看和控制部分。但是,它們不是數據模型。

如果您有一個由頁面「構建」的單獨對象,您會更高興。每個頁面將設置該基礎模型對象的一些屬性。然後,這些頁面彼此獨立,因爲這些頁面都獲得並設置了該基礎模型對象的值。

既然你正在構建一個角色,你有一些類這樣

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

那麼你的各種嚮導實例只需要給予底層角色目標投入,並獲得價值的地方。

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) 

我然後使用美國洛特提供的信息和創建的各個每個類中的實例(如果這就是所謂的)儘管每個類都訪問相同的變量。

就我所知,一切正常。謝謝。