2016-12-28 134 views
0

我最近決定開始學習python。我大部分時間都使用C++,有些東西對我來說非常混亂。更正python中已初始化對象的正確方法

這裏是我的代碼,我有(全代碼在這裏:http://pastebin.com/tj3qJnvM)的問題

class Display: 

    def __init__(self, background): 
     resolution = (800, 600)  
     screen = pygame.display.set_mode(resolution) 
     background = pygame.Surface(screen.get_size()) 
     background.fill((255, 255, 255)) 
     background = background.convert() 

def init(map, background): 
    pygame.init() 
    display = Display(background) 
    map.draw(background) 

def main(): 
    background = None 
    init(map, background) 

當我打電話display = Display(background)init(61行),它應該初始化背景,因此它可以在未來使用線。相反,我得到錯誤說背景是無。

如果我理解正確,這是由於背景被設置爲None和None不可變因此它在Display構造函數中創建局部變量背景。

我該如何處理這種情況?

我知道最好是將背景設置爲Display類的成員,但我想了解如何創建類似於在C中聲明指針/引用的東西。然後在某些函數中初始化它。 這將是有用的,然後將它傳遞給一些功能。

是否有可能在Python中或每次都需要解決方法?

+1

請在問題中加上[mcve]。另外,你並沒有使用'self.',因爲我認爲它是實例屬性;閱讀教程。 – jonrsharpe

+0

對不起,現在的例子應該更具可讀性。我想從其他函數的main中初始化背景,所以我不想在這種情況下使用self。 – Thun

+0

也許已經閱讀了教程的[第9節,類](https://docs.python.org/3/tutorial/classes.html)。看起來你需要花更多的時間學習如何用Python的方式來完成任務。 。 'display'''是'''Display'''的一個實例,它的屬性可以通過''display.attribute'''訪問。 - 但是你寫類的方式沒有任何實例屬性。你也應該閱讀[命名和綁定](https://docs.python.org/3/references/executionmodel.html#naming-and-binding)。 – wwii

回答

0

固定。我認爲你正在尋找類實例變量中的保存狀態。如果你想保存課堂上的東西,請使用self.。和大多數語言一樣,除非特別定義爲全局變量,否則變量不會影響範圍之外的任何內容。我加了self.並刪除了背景變量函數參數。

class Display: 

    def __init__(self): 
     resolution = (800, 600)  
     screen = pygame.display.set_mode(resolution) 
     background = pygame.Surface(screen.get_size()) 
     background.fill((255, 255, 255)) 
     self.background = background.convert() 

def init(map): 
    pygame.init() 
    display = Display() 
    map.draw(display.background) 

def main(): 
    init(map) 

此外,您還沒有定義map那麼你將有問題map.draw。它只運行,因爲map恰好是一個內置的Python函數。

編輯:沒關係,忘記我剛纔說的^。

我看到您的完整代碼示例定義它。

+0

出於這個原因,我會建議不要使用「地圖」作爲參數名稱,但在技術上它不應該造成這種非常有限的情況下,任何問題(因爲它只有一個函數調用的範圍內存在) –

+0

是啊,這正是我做了,它的工作很好。把課堂背景放在課堂上是更好的方法。謝謝! 編輯:你忘了把自己。之前的其他「背景」:) – Thun

+0

不,其他「背景」變量只是一個局部變量,並沒有一個「self.」在它前面。它僅在從'.convert()'返回後才被設置。使它成爲一個類字段是多餘的,因爲它只會被'self.background = [self。] background.convert()'覆蓋。 –