2012-12-03 42 views
0

我對python比較陌生,但認爲我有足夠的理解,除了(顯然)使用「導入」語句的正確方法。我認爲這是問題,但我不知道。在一個函數中實例化一個對象 - Python

from player import player 

def initializeGame(): 
    player1 = player() 
    player1.shuffleDeck() 
    player2 = player() 
    player2.shuffleDeck() 

from deck import deck 

class player(object): 
    def __init__(self): 
     self.hand = [] 
     self.deck = deck() 

    def drawCard(self): 
     c = self.deck.cards 
     cardDrawn = c.pop(0) 
     self.hand.append(cardDrawn) 

    def shuffleDeck(self): 
     from random import shuffle 
     shuffle(self.deck.cards) 

但是,當我嘗試initializeGame()它說: 「PLAYER1尚未定義」,我真的不知道爲什麼。在同樣的文件中,如果我只是使用「player1 = player()」,那麼它就非常好,但它拒絕在函數內部工作。任何幫助?

編輯:未包括前

class deck(object): 
    def __init__(self): 
     self.cards = [] 

    def viewLibrary(self): 
     for x in self.cards: 
      print(x.name) 

    def viewNumberOfCards(self, cardsToView): 
     for x in self.cards[:cardsToView]: 
      print(x.name) 


from deck import deck 

class player(object): 
    def __init__(self): 
     self.hand = [] 
     self.deck = deck() 

    def drawCard(self): 
     c = self.deck.cards 
     cardDrawn = c.pop(0) 
     self.hand.append(cardDrawn) 

    def shuffleDeck(self): 
     from random import shuffle 
     shuffle(self.deck.cards) 

和追蹤誤差加法東西

player1.deck.cards 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    player1.deck.cards 
NameError: name 'player1' is not defined 
+0

是否真的說'player1'(而不是''''''沒有'1')沒有定義?這是一個原因,你應該包括一個完整的回溯... – delnan

+0

回溯(最近通話最後一個): 文件「」,1號線,在 player1.deck.cards NameError:名字「PLAYER1」沒有定義 如果我嘗試player1.deck.cards應該返回「[]」這是我得到的完整回溯,我的道歉不包括它 –

+0

@CarlReyes錯誤中給出的代碼不在您給我們的代碼中。 –

回答

6
Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    player1.deck.cards 
NameError: name 'player1' is not defined 

這顯示了引發錯誤的行:player1.deck.cards。該行不在您提供給我們的代碼中,因此我們只能對爲什麼得到異常做出假設。

然而,這是非常有可能的,你的腳本看起來在某種程度上是這樣的:

initializeGame() 

# and then do something with 
player1.deck.cards 

然而,這並不工作,因爲player1player2initializeGame函數內部只有局部變量。只要函數返回,就不會再引用它們,並且它們很可能等待垃圾回收。

所以,如果你想訪問這些對象,你必須確保他們呆在附近。您可以通過全球範圍內具有變量做到這一點,或者你可以簡單地從你的initializeGame函數返回他們:

def initializeGame(): 
    player1 = player() 
    player1.shuffleDeck() 
    player2 = player() 
    player2.shuffleDeck() 
    return player1, player2 

然後,你可以這樣調用:

player1, player2 = initializeGame() 

而且具有對本地引用創建的對象。

甚至更​​好,創建一個代表整場比賽,這裏的球員都是實例變量的對象:

class Game: 
    def __init__ (self): 
     self.player1 = player() 
     self.player1.shuffleDeck() 
     self.player2 = player() 
     self.player2.shuffleDeck() 

然後,你可以創建一個Game實例,並使用game.player1game.player2訪問的球員。當然,擁有遊戲本身的對象也允許你將很多與遊戲相關的功能封裝到對象中。

4

我推測是引用PLAYER1代碼的功能之外。函數內定義的變量是局部變量,並在函數調用結束時被銷燬。

您需要將player1和player2聲明爲全局變量,或者將整個事物包裝到一個類中,並使其成爲類實例的屬性。

相關問題