class Card:
def __init__(self, suit):
self.suit = SUITS[suit]
SUITS = ("HEARTS", "SPADES", "DIAMONDS", "CLUBS")
无论如何直接从元组中直接访问这四个值中的一个并存储它?这样我就可以创建一个Card类型的新对象,然后设置它的套装,只有元组中的四个值中的一个。
我想把一个字符串作为输入参数,例如myCard = Card(HEARTS)
答案 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'
但是,你仍然应该检查默认值是否属于可能的值,并且此时加注和异常(或根据你的目标将其添加到它们)