首页 > 解决方案 > 关于使用 OOP python 的卡片组的问题

问题描述

这是当前代码:

import random

class Cards():
    def __init__(self, value, suit):
        self.value = value
        self.suit = suit

    def show(self):
        print("{} of {}".format(self.value, self.suit.upper()))


class Deck():
    def __init__(self):
        self.cards = []
        self.build()

    def build(self):
        suits = ['Spades', 'Hearts', 'Clubs', 'Diamonds']

        for suit in suits:
            for value in range(1,14):
                self.cards.append(Cards(value,suit))

    def show(self):
        for card in self.cards:
            card.show()

    def shuffle(self):
        for i in range(len(self.cards)-1, 0, -1):
            rand = random.randint(0, i)
            self.cards[i], self.cards[rand] = self.cards[rand], self.cards[i]

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


deck = Deck()
deck.shuffle()

deck.draw().show()

OOP 部分仍然让我感到困惑,所以请原谅我的基本问题,但我为什么能做到deck.draw().show()却不能deck.shuffle().draw().show()呢?

我的意思是,当我保持deck.shuffle()然后做deck.draw().show()时,它会返回给我随机卡片。那么如果我只是想做deck.shuffle().draw().show()呢?为什么它给我一个错误

Traceback (most recent call last):
  File "c:\Users\Desktop\deckofcards.py", line 40, in <module>
    deck.shuffle().draw().show()
AttributeError: 'NoneType' object has no attribute 'draw'
PS C:\Users\learning_log> 

标签: python-3.xoop

解决方案


您只需稍作改动即可获得该行为:

    def shuffle(self):
        for i in range(len(self.cards)-1, 0, -1):
            rand = random.randint(0, i)
            self.cards[i], self.cards[rand] = self.cards[rand], self.cards[i]
        return self # <- return a reference to the deck itself

示范:

In [95]: deck.shuffle().draw().show()
8 of HEARTS

您收到该错误的原因是您没有returnshuffle().


推荐阅读