【发布时间】:2018-08-19 22:36:05
【问题描述】:
我一直在尝试学习 Python 中的面向对象编程,并想从编程纸牌游戏开始。我打算尝试编写几个不同的游戏,所以我想从一个可以为我尝试制作的任何游戏调用的套牌类开始。
我可以通过函数获得基本行为,但我不知道如何将它变成一个类。我首先想到了这个:
class Deck:
def shuffle():
cards = []
suits = ['H', 'D', 'S', 'C']
for suit in suits:
for i in range(1, 14):
cards.append((i, suit))
shuf_deck = random.sample(cards, len(cards))
return shuf_deck
上述方法有效,但效果不是很好。它只是一个函数,一方面,它做了两件事,创建甲板和洗牌;似乎这些应该是不同的。对于__init__ 函数来说,从创建套牌开始似乎是一项不错的工作。基于another question,我得到了这个:
class Deck:
def __init__(self):
self.suits = ['Hearts', 'Diamonds,' 'Spades', 'Clubs']
self.values = range(1, 14)
self.cards = []
for Card in itertools.product(self.suits, self.values):
self.cards.append(Card)
def shuffle():
# Not quite sure what to do here yet
return self.cards
deck = Deck()
print(deck)
但这不起作用。 __init__ 函数中的代码成功地创建了卡片组,但我无法将其“客观化”。我尝试了几种不同的方法,它要么返回类似<__main__.Deck object at 0x7f56969f5630> 的东西,我相信这是对象本身的内存地址,要么我得到某种错误、无效语法、属性错误等。我可以' t 似乎从__init__ 获取数据;当我尝试直接从__init__ 返回数据时,我得到一个错误,每当我尝试从类中的另一个方法获取该数据时,我也会得到错误。有人能告诉我我错过了什么吗?
【问题讨论】:
-
这是我在其他问题上发布的答案,您可能会从中得到帮助:stackoverflow.com/a/50770568/5079316
-
你说的“我不能把它‘客观化’”是什么意思?
<__main__.Deck object at 0x7f56969f5630>是您的Deck对象的表示形式。现在,问题是你想对甲板对象做什么。您可以实现一种方法来对其进行洗牌,并实现一种方法来遍历其卡片等。 -
我所说的“客观化”的意思是,即使我在概念上理解结果应该是类似于 @OlivierMelançon 的 Deck API 的东西,但我什至无法远程开始制作糟糕的版本工作。我只是得到一个或一系列恰好在类声明中的函数,而不是对象的真正“对象化”模型;我不知道如何更准确地说。
-
@OlivierMelançon 你在这里所做的正是我想要做的,但还没有弄清楚如何去做。谢谢你这么彻底的回答;它似乎也回答了我肯定会遇到的接下来的十几个问题。
标签: python oop object-oriented-analysis