如何直接从元组中检索字符串?

时间:2016-02-08 21:40:47

标签: python python-2.7

class Card:
    def __init__(self, suit):
        self.suit = SUITS[suit]
    SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")

无论如何直接从元组中直接访问这四个值中的一个并存储它?这样我就可以创建一个Card类型的新对象,然后设置它的套装,只有元组中的四个值中的一个。

我想把一个字符串作为输入参数,例如myCard = Card(HEARTS)

3 个答案:

答案 0 :(得分:2)

您可以针对SUITS进行验证。 如果给出无效诉讼,可以提出ValueError

class Card:
    SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")
    def __init__(self, suit):
        if suit not in self.SUITS:
             raise ValueError('invalid argument suit. must be: {}'.format(
                  ', '.join(self.SUITS)
             ))
        self.suit = suit

现在可以通过

创建一个实例
burp = Card('SPADES')

另一种方法是在这里使用Enum's

from enum import Enum
class Suits(Enum):
    HEARTS = 0
    SPADES = 1
    DIAMONDS = 2
    CLUBS = 3

class Card:
    def __init__(self, suit):
        assert(type(suit) is Suits)
        self.suit = suit

snurz = Card(Suits.CLUBS)

答案 1 :(得分:1)

在您的课程中,您需要在SUITS前加上Card(或self),如下所示:

class Card:
    def __init__(self, suit):
        self.suit = Card.SUITS[suit]    # N.B. specify the class
    SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")

>>> for i in range(len(Card.SUITS)):
...     c = Card(i)
...     print(c.suit)
HEARTS
SPADES
DIAMONDS
CLUBS

我不打算验证suit参数;如果提供的值无效,Card.SUITS[suit]如果超出范围则会引发IndexError,如果提供了非整数参数,则引发TypeError。如果你愿意的话,你可以抓住任何一个例外并自己筹集。

答案 2 :(得分:0)

如果您希望将self.suit分配给给定名称(如果该值属于可接受的值),则将其分配给默认值

>>> class Card:
...     SUITS = {"HEARTS", "SPADES", "DIAMONDS", "CLUBS"} # you can still use the tuple if you prefer
...     def __init__(self, suit):
...         self.suit = suit if suit in self.SUITS else 'HEARTS' # default_value
... 
>>> c=Card('abc')
>>> c.suit
'HEARTS'
>>> c=Card('DIAMONDS')
>>> c.suit
'DIAMONDS'

注意:我同意@keksnicoh的方法(upvoted),这引起了例外。

另一种方法是将默认值作为参数传递(显式优于隐式,还记得吗?)

>>> class Card:
...     SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")
...     def __init__(self, suit, default='HEARTS'):
...         self.suit = suit if suit in self.SUITS else default
... 
>>> c=Card('abc')
>>> c.suit
'HEARTS'
>>> c=Card('abc', 'DIAMONDS')
>>> c.suit
'DIAMONDS'

但是,你仍然应该检查默认值是否属于可能的值,并且此时加注和异常(或根据你的目标将其添加到它们)