python-3.x - 关于使用 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>
解决方案
您只需稍作改动即可获得该行为:
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
您收到该错误的原因是您没有return
从shuffle()
.
推荐阅读
- flutter - 如何使用颤振将动态值传递给其他小部件
- vue.js - 我如何使它成为“应用程序”属性
不适用于“xs”屏幕尺寸,因此抽屉位于内容之上? - c - inotify_add_watch 的 fd 参数是什么?
- flutter - 如何展平列表
- python-3.x - 使用 datetime 模块减少 python3 中的日期代码
- python - 如何以pythonic方式从数组中删除十进制值
- laravel - 为什么注册时收不到确认邮件?
- flutter - 如何在 Dart 中将字符串索引转换为字符索引
- python - 如何使用多索引数据框绘制图表
- go - 如何检查一个函数在测试中被调用了多少次?