【问题标题】:Deck card class in pythonpython中的甲板卡类
【发布时间】:2013-11-16 11:26:49
【问题描述】:

我正在第一次创建一个类,我想我已经做了所有的事情来让它运行,但我仍然遇到很多问题,那就是 'list' object has no attribute 'shffule' 所以这里的问题是它不会洗牌,它不会告诉剩下的牌,谁能告诉我我做错了什么?在此先感谢

 import random

 class card_deck:
     def __init__(self, rank, suite, card):


        self.rank= rank
         self.suite = suite
    def ranks(self):
         return self.rank
    def suites(self):
         return self.suite
     def cards(self,card):
         suit_name= ['The suit of Spades','The suit of Hearts', 'The suit of Diamonds','Clubs']
         rank_name=['Ace','2','3','4','5','6','7','8','9','10','Jack','Queen','King']


     def value(self):
         if self.rank == 'Ace':
             return 1
         elif self.rank == 'Jack':
             return 11
         elif self.rank == 'Queen':
             return 12
         elif self.rank == 'King':
             return 13
     def shffule(self):
         random.shuffle(self.cards)
     def remove(self,card):
         self.cards.remove(card)


     def cardremaining(self):
        self.suite-self.rank




 def main():
     try:
         deck=[]
         for i in ['Spades','Hearts', ' Diamonds','Clubs']:
         for c in ['Ace','2','3','4','5','6','7','8','9','10','Jack','Queen','King']:
                 deck.append((c, i))
         deck.shffule

         hand = []
         user =eval(input('Enter a number of cards: 1-7 '))
         print()
         while user <1 or user >7:
             print ("Only a number between 1-7:")
             return main()

         for i in range(user):
             hand.append(deck[i]) 
         print (hand)
     except ValueError:
         print("Only numbers")
         main()

【问题讨论】:

  • shuffle 是 card_deck 类的一种方法,您正在尝试在列表中使用它。首先将您的列表转换为 card_deck。
  • 我建议不要到处打错,至少。
  • 谢谢,我在这里遇到了另一个问题“文件”/Users/user/Desktop/deck_class.py”,第 55 行,在 main hand.append(deck[i]) TypeError: 'type'对象不可下标”
  • @sashkello 感谢您的帮助,它现在可以工作了,但是为什么我没有得到卡名 [main.card_deck'>, 0, 1, 2]
  • 因为您需要打印卡片名称,而不是类(例如,在您的类中为它创建一个单独的方法)。当您说要打印类的实例时,您的解释器不知道您要打印名称...

标签: python class random


【解决方案1】:

除了您的代码包含许多小错误之外;我将尝试回答您的主要问题。

如果您打算使用card_deck 类的shffule[原文] 方法,那么您首先需要创建该类的实例(而您尝试使用列表)。像这样:

deck = card_deck(some_rank,some_suit,some_card)
deck.shffule() #Now you can call the method

现在,由于您将其设为类实例,因此您无法从中获取项目,例如 hand.append(deck[i])
除非你在类定义中定义了 __getitem__ 方法,像这样:

#this will be in your class definition
def __getitem__(self,i):
    return self.card_list[i] #Of course you have to define a list of cards in your class too.

在我看来,您应该多花一点时间来尝试了解类是如何定义的、方法是如何工作的以及如何访问类的成员。之后你会在这里做得更好

【讨论】:

  • 谢谢你的帮助,我不知道我是不是在问一个愚蠢的问题,但我会照做,当你回答第一个问题时,deck = card_deck(rank=some_rank ,suite=some_suit,card=some_card) 你说的 rank=some_rank 是什么意思....有时会很困惑,这是我的第一语言,我对此感觉很糟糕,因为有时我觉得自己愚蠢到不能成为计算机专业的学生!
  • 别担心,没关系。你只需要使用更简单的东西来掌握基本的想法。关于deck = card_deck(...) 的东西,你实际上不需要那样使用它,我只是想明确地展示它。我现在更新了答案。
【解决方案2】:

您实际上从未创建 card_deck 类的实例。表达式

deck=[] 

创建一个名为 deck 的变量,引用一个空列表。

在 python 中,[a, b, c,...] 是创建列表文字的语法。

【讨论】:

    【解决方案3】:
    from collections import namedtuple
    
    Card = namedtuple('Card', 'sign, value')  #  no need to write class to represent card
    SIGNS = ['Hearts', 'Diamonds', 'Spades', 'Clubs']
    
    
    class Deck:
        def __init__(self):
            self.cards = [Card(sign, value) for sign in SIGNS for value in range(2,
                                                                                 11) +
                          'J Q K A'.split()]
    
        def __repr__(self):
            return str([str(card) for card in self.cards])
    
        def __len__(self):
            return len(self.cards)
    
        def __getitem__(self, item):
            return self.cards[item]
    
        def __setitem__(self, key, value):
            self.cards[key] = value
    
    
    deck = Deck()
    
    print deck[11]  # indexing works, prints Card(sign='Hearts', value='K')
    
    print len(deck)  # prints 52
    
    print deck[13:16]  # slicing works
    
    import random
    
    random.shuffle(deck)  # shuffle works using no extra code
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      相关资源
      最近更新 更多