初学蟒蛇开发者在玩游戏并尝试制作纸牌游戏。使用我自己的系统随机选择卡片。
import random
# list to draw random card from from:
card_names = ["ace_h", "two_h", "three_h"]
class Cards(object):
in_play = False
def __init__(self, face, color, value):
self.face = face
self.color = color
self.value = value
ace_h = Cards("Ace", "Hearts", 14)
two_h = Cards("Two", "Hearts", 2)
three_h = Cards("Three", "Hearts", 3)
random_1 = random.choice(card_names)
print (random_1 +".face")
如果通过随机化选择ace_h
,我希望最后的打印会显示打印ace_h.face
的结果(这将是Ace)。相反,打印只是将ace_h.face
显示为字符串,而不是与其关联的实际值。
我该如何更改?
请注意,只需使用print (ace_h.face)
即可获得所需的结果。
答案 0 :(得分:0)
您可以将所有对象放入如下列表中:
objectList = [ace_h, two_h, three_h]
random_1 = random.choice(objectList)
然后打印您想要的属性:
print(random_1.face)
答案 1 :(得分:0)
有几种方法你可以立即想到这样做。
您可以更改MO并预先初始化变量列表:
import random
class Cards(object):
in_play = False
def __init__(self, face, color, value):
self.face = face
self.color = color
self.value = value
ace_h = Cards("Ace", "Hearts", 14)
two_h = Cards("Two", "Hearts", 2)
three_h = Cards("Three", "Hearts", 3)
# list to draw random card from from:
cards = [ace_h, two_h, three_h]
random_1 = random.choice(cards)
print (random_1.face)
正如您所看到的,我只是稍微重新排序了您的代码,以便card_names
可以包含对实际Card
对象的引用,而不是它们的名称。这可能是最简单的方法。
您可以按名称访问全局变量。这有点复杂,可能不是你想要的,但这项技术可以用于其他事情:
import random
# list to draw random card from from:
card_names = ["ace_h", "two_h", "three_h"]
class Cards(object):
in_play = False
def __init__(self, face, color, value):
self.face = face
self.color = color
self.value = value
ace_h = Cards("Ace", "Hearts", 14)
two_h = Cards("Two", "Hearts", 2)
three_h = Cards("Three", "Hearts", 3)
random_1 = random.choice(card_names)
print(globals()[random_1].face)
这与原始代码更相似。 globals()
返回一个dict
,其中包含在模块级别定义的所有名称,包括函数,类和变量,所有这些都是按名称键入的。因此,globals()[random_1]
将成为Cards
对象(我认为顺便说一下,我应该将其重命名为Card
。
在函数内部,您可以使用locals()
为该函数中的本地命名空间获取类似的dict()
。例如,在Cards.__init__
中,您可以执行locals()['face']
之类的操作来访问face
参数。
答案 2 :(得分:0)
你对如何在Python中引用事物有一个基本的误解。
在Python中,您有变量名称:
ace_h = 1
two_h = 2
three_h = 3
您可以按名称调用这些值:
print(ace_h) # => 1
您可以将值放入另一个集合中:
cards = [ace_h, two_h, three_h]
print(cards) # [1, 2, 3]
您可以打印特定元素:
print(cards[0])
您可以打印随机元素:
print(random.choice(cards))
但这些都是指值 1, 2, 3
。
您可以通过查看id
:
print(id(ace_h))
print(id(cards[0]))
如果您使用ace_h
或cards[0]
方法命名该值,则无关紧要,它就是相同的。
这对于Python中的所有也是如此 - 它们都是对象。您可以为它们指定任何类型的名称,无论是变量名称,将它们放在列表中还是字典中 - 只要id(thing)
相同,您就是在谈论完全相同的对象。
ace_h = Cards("Ace", "Hearts", 14)
two_h = Cards("Two", "Hearts", 2)
three_h = Cards("Three", "Hearts", 3)
cards = [ace_h, two_h, three_h]
print(cards)
for card in cards:
print(id(card))
print(id(ace_h))
print(id(two_h))
print(id(three_h))
random_card = random.choice(cards)
print(id(random_card))
print(random_card.face)
print('random card is ace_h? {}'.format(random_card is ace_h))
print('random card is two_h? {}'.format(random_card is two_h))
print('random card is three_h? {}'.format(random_card is three_h))
如果您将变量视为附加到值的标签,那么您会好多了。在您的情况下,您正在创建Card
值,并且您在其上贴有标签ace_h
。您还将Card
放在列表中,您可以通过名称cards[0]
来引用它。你可以给它任意数量的名字:
another_name = ace_h
cool_name = ace_h
king_arthur = ace_h
sir_lancelot = ace_h
minister_of_silly_walks = ace_h
现在,这些名称中的每一个都指向完全相同的值。您可以使用id
进行检查,您可以看到它们都具有print(dir(ace_h))
和print(dir(minister_of_silly_walks)))
的正确属性。您可以使用ace_h is minister_of_silly_walks
检查它们是否是同一个对象。