【问题标题】:OOP Deck of Cards in Python [duplicate]Python中的OOP卡片组[重复]
【发布时间】: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


【解决方案1】:

deck 是实际的 Deck 对象。 print(deck) 会给你对象的内存地址。

通过“从__init__获取数据”,相信你有兴趣获取属性:

deck.suits # this will give you ['Hearts', 'Diamonds,' 'Spades', 'Clubs']
deck.values # this will be [1,2, ..13]

等等。

【讨论】:

  • 感谢您指出这一点!
  • 酷,这回答了我关于 init 的问题。我所说的“获取数据”的意思只是能够在方法中对其进行处理并返回值。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2021-05-04
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多