在方法argumen中传递类实例

2024-05-13 03:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习面向对象编程,很难掌握不同班级之间的互动。我读了这么多的例子,但大多数都展示了单个类是如何工作的,很明显,我想看看不同的类之间是如何相互作用的。如果有人有一个很好的例子,说明不同的类是如何相互作用的,那就太好了。你知道吗

这里我创建Deck实例newDeck,然后创建Player实例p1。然后我做这个: newCard.append(player.generateCard(newDeck))其中playerp1,所以我调用Player方法generateCard(),并传递类DecknewDeck实例。这允许吗?你知道吗

这里我得到一个错误:

   File "poker.py", line 67, in startGame
    newCard.append(player.generateCard(newDeck))
AttributeError: 'str' object has no attribute 'generateCard'`

我的代码:

import random, string, sys

class Deck:
    def __init__(self):
        self.suits = ['s', 'h', 'd', 'c']
        self.ranks = ['2', '3', '4', '5', '6' ,'7', '8', '9', '10', 'J', 'Q', 'K', 'A']
        self.deck = [i+j for i in self.ranks for j in self.suits]
        random.shuffle(self.deck)

    def selectCards(self):
        self.selectedCard = self.deck.pop()
        return self.selectedCard

class Player:
    def __init__(self, amount):
        self.amount = amount
        self.card = []

    def generateCard(self, whichDeck):
        self.whichDeck = whichDeck
        holeCards = 2
        for i in range(0, holeCards):
            selCard = self.whichDeck.selectCards()
            if len(selCard) == 2:
                self.cardRank = list(selCard[0])
            else:
                self.cardRank = list('10') 
            self.cardSuit = list(selCard[-1])
            self.generatedCard = list(self.cardRank + self.cardSuit)
            self.card.append(self.generatedCard)
        return self.card 

class Game:
    def __init__(self, numPlayers, startingStack):
        self.startingStack = startingStack
        self.numPlayers = numPlayers

    def startGame(self):
        newDeck = Deck()
        playerList = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8']
        currentPlayer = 0
        for player in playerList:
            player = Player(self.startingStack)
            currentPlayer += 1 
            if currentPlayer == self.numPlayers:
                break
        totalPlayers = currentPlayer
        # -------------------------- GAME STARTS ---------------------------
        newCard = []
        currentPlayer = 0
        for player in playerList:                
            newCard.append(player.generateCard(newDeck)) # ERROR IS HERE               
            if currentPlayer == self.numPlayers:
                break

def main():
    numberOfPlayers = 1
    playerStack = 100
    newGame = Game(numberOfPlayers, playerStack)    
    newGame.startGame()
if __name__ == '__main__':
    main()

Tags: inselffordefplayerdeckappendnewcard
2条回答

如果没有任何Player实例,请创建string实例列表:

playerList = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8']

然后在循环中你就这么做了

for player in playerList:
        player = Player(self.startingStack)
        currentPlayer += 1 
        if currentPlayer == self.numPlayers:
            break

这个局部变量player丢失了,它不会神奇地附加到你的playerList

简单地做一些

playerList = [ Player(self.startingStack) for _ in range(self.numPlayers) ]

而不是你的循环

你的playerList对象仍然是字符串列表。你的循环:

for player in playerList:
    player = Player(self.startingStack)
    currentPlayer += 1 
    if currentPlayer == self.numPlayers:
        break

player重新绑定到Player()实例,但这不会更改playerList对象。事实上,当您进入下一个迭代时,Player()实例再次被丢弃,因为没有其他引用它。你知道吗

for player in playerListplayer依次绑定到列表中的每个字符串,但引用不起相反的作用,player只是另一个Python名称,另一个引用包含在playerList中的同一对象。将不同的对象赋给它也不会改变从中获取字符串的列表。你知道吗

你可能想在这里建立一个新的列表:

def startGame(self):
    newDeck = Deck()
    playerList = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8']
    players = []
    for player in playerList[:self.numPlayers]:
        player = Player(self.startingStack)
        players.append(player)
    totalPlayers = self.numPlayers
    #               GAME STARTS              -
    newCard = []
    for player in players:           
        newCard.append(player.generateCard(newDeck))

但是,您在这里完全忽略了playerList中的字符串;也可以只构建列表而不咨询以下内容:

def startGame(self):
    newDeck = Deck()
    players = [Player(self.startingStack) for _ in range(self.numPlayers)]
    newCard = [player.generateCard(newDeck) for player in players]

但是你也不需要players作为一个单独的列表:

def startGame(self):
    newDeck = Deck()
    newCard = [Player(self.startingStack).generateCard(newDeck)
               for _ in range(self.numPlayers)]

相关问题 更多 >