Управление экземплярами в Python - PullRequest
1 голос
/ 03 июня 2010

Я новичок в Python, и я впервые задаю вопрос stackOverflow, но давно читаю. Я работаю над простой карточной игрой, но у меня возникают проблемы с управлением экземплярами моего класса Hand. Если вы посмотрите ниже, то увидите, что класс рук - это простой контейнер для карт (которые являются просто значениями типа int), и каждый класс Player содержит класс рук. Однако всякий раз, когда я создаю несколько экземпляров своего класса Player, они все, похоже, манипулируют одним экземпляром класса Hand. Из моего опыта в C и Java кажется, что я как-то делаю свой класс Hand статичным. Если бы кто-нибудь мог помочь с этой проблемой, я был бы очень признателен.

Спасибо, Тад

Чтобы уточнить: примером такой ситуации будет

p = player.Player ()
p1 = player.Player ()
p.recieveCard (15)
p1.recieveCard (21)
p.viewHand ()

, что приведет к: [15,21]
хотя к р

была добавлена ​​только одна карта

Класс рук:

class Hand:

    index = 0
    cards = [] #Collections of cards

    #Constructor
    def __init__(self):
        self.index
        self.cards

    def addCard(self, card):
        """Adds a card to current hand"""
        self.cards.append(card)
        return card

    def discardCard(self, card):
        """Discards a card from current hand"""
        self.cards.remove(card)
        return card

    def viewCards(self):
        """Returns a collection of cards"""
        return self.cards

    def fold(self):
        """Folds the current hand"""
        temp = self.cards
        self.cards = []
        return temp

Класс игрока

import hand
class Player:

 name = ""
 position = 0
 chips = 0
 dealer = 0
        pHand = []

 def __init__ (self, nm, pos, buyIn, deal):
            self.name = nm
            self.position = pos
            self.chips = buyIn
            self.dealer = deal

            self.pHand = hand.Hand()
            return

        def recieveCard(self, card):
            """Recieve card from the dealer"""
            self.pHand.addCard(card)
            return card

        def discardCard(self, card):
            """Throw away a card"""
            self.pHand.discardCard(card)
            return card

        def viewHand(self):
            """View the players hand"""
            return self.pHand.viewCards()

        def getChips(self):
            """Get the number of chips the player currently holds"""
            return self.chips

        def setChips(self, chip):
            """Sets the number of chips the player holds"""
            self.chips = chip
            return

        def makeDealer(self):
            """Makes this player the dealer"""
            self.dealer = 1
            return

        def notDealer(self):
            """Makes this player not the dealer"""
            self.dealer = 0
            return

        def isDealer(self):
            """Returns flag wether this player is the dealer"""
            return self.dealer

        def getPosition(self):
            """Returns position of the player"""
            return self.position

        def getName(self):
            """Returns name of the player"""
            return self.name

Ответы [ 3 ]

4 голосов
/ 03 июня 2010

Из моего опыта работы с C и Java кажется, что я каким-то образом делаю свой класс Hand статичным.

На самом деле, это в основном то, что вы делаете. Ну, на самом деле не статический класс, а статическая переменная.

Когда вы пишете объявления, подобные этому:

class Hand:
    cards = []

эта переменная (cards) связана с классом , а не с экземпляром. Чтобы сделать аналогию с Java, каждый оператор в классе Python, который не является частью метода этого класса, в основном выполняется в статическом инициализаторе. Вы можете почти думать об этом так:

class Hand {
    static {
        cards = new object[];
    }
}

(просто грубая аналогия, конечно)

Чтобы создать переменную экземпляра в Python, вы должны установить ее как атрибут экземпляра, который требует от вас ожидания, пока у вас не появится ссылка на экземпляр. На практике это означает, что вы инициализируете его в конструкторе, например:

class Hand:
    def __init__(self):
        self.cards = []
3 голосов
/ 03 июня 2010

Ваша проблема довольно проста

если вы присваиваете списки телу классов Python, когда вы добавляете к нему элементы, они будут храниться на уровне класса, а не на уровне экземпляра.

Вы можете решить эту проблему, добавив строку:

def __init__(self):
    self.cards = []

это очень известный случай ловушки на питоне, и я рекомендую вам прочитать: http://zephyrfalcon.org/labs/python_pitfalls.html

0 голосов
/ 03 июня 2010

Как уже отмечалось в других ответах, вы были озадачены переменными класса и переменными экземпляра. Я предлагаю вам ознакомиться с основами работы классов Python. Вот ответ, который я написал для другого вопроса; чтение этого может помочь вам.

Как определить класс в Python

...