类:我不太明白它们

-4 投票
1 回答
1877 浏览
提问于 2025-04-17 18:35

我现在正在读一本书,书名叫《如何像计算机科学家一样思考》。

最近我在书里写了一段代码:

class Card:
    suitList = ["Clubs", "Diamonds", "Hearts", "Spades"]
    rankList = ["narf", "Ace", "2", "3", "4", "5", "6", "7",
                "8", "9", "10", "Jack", "Queen", "King"]

    def __init__(self, suit=0, rank=0):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        return (self.rankList[self.rank] + " of " + self.suitList[self.suit])

    def __cmp__(self, other):
        #check the suits
        if self.suit > other.suit: return 1
        if self.suit < other.suit: return -1
        #suits are the same... check ranks
        if self.rank > other.rank: return 1
        if self.rank < other.rank: return -1
        #ranks are the same... it's a tie
        return 0    

class Deck:
    def __init__(self):
        self.cards = []
        for suit in range(4):
            for rank in range(1, 14):   
                self.cards.append(Card(suit, rank))

    def printDeck(self):
        for card in self.cards:
            print card

    def __str__(self):
        s = ""
        for i in range(len(self.cards)):
            s = s + " "*i +str(self.cards[i]) + "\n"
        return s

    def shuffle(self):
        import random
        nCards = len(self.cards)
        for i in range(nCards):
            j = random.randrange(i, nCards)
            self.cards[i], self.cards[j] = self.cards[j], self.cards[i]

    def removeCard(self, card):
        if card in self.cards:
            self.cards.remove(card)
            return 1
        else:
            return 0

    def popCard(self):
        return self.cards.pop()

    def isEmpty(self):
        return (len(self.cards) == 0)

    def deal(self, hands, nCards=999):
        nHands = len(hands)
        for i in range(nCards):
            if self.isEmpty(): break
            card = self.popCard()
            hand = hands[i % nHands]
            hand.addCard(card)

class Hand(Deck):
    def __init__(self, name=""):
        self.cards = []
        self.name = name

    def addCard(self,card):
        self.cards.append(card)

    def __str__(self):
        s = "Hand " + self.name
        if self.isEmpty():
            return s + "is empty\n"
        else:
            return s + " contains\n" + Deck.__str__(self)

class CardGame:
    def __init__(self):
        self.deck = Deck
        self.deck.shuffle()

deck = Deck()
deck.shuffle()
hand = Hand("frank")
deck.deal([hand], 5)
print hand     

我明白里面的self是什么意思,但我不太明白

self.deck.shuffle()

这个东西是从哪里来的,以及它为什么会出现在__init__这个函数里。我需要一个关于类的好解释,还有一些日常的例子来帮助我理解。

1 个回答

2

__init__这个函数的作用就是它名字所暗示的:初始化一个类的实例。

可以把类想象成饼干模具,而对象就是用这个模具做出来的饼干:类是用来创建和操作内存中实例的蓝图。

那么,类和对象有什么用呢?它们把数据和功能结合在一起,形成一个完整的单元。

计算机科学中的每一种语言都试图帮助你处理一件事:管理复杂性。它把细节封装起来,隐藏在用户看不见的地方,这样用户只需要关注这个类如何与他们的实际生活经验相对应,就能有效地使用它。

还有一个建议:不要使用类。Python是一种结合了面向对象和函数式编程的语言。如果你不理解类,可以先不使用它们。继续学习,直到你明白为止,然后再开始把它们融入到你的设计中。

撰写回答