Python:打印函数调用随机生成的类对象

时间:2016-10-18 14:01:20

标签: python-3.x

初学蟒蛇开发者在玩游戏并尝试制作纸牌游戏。使用我自己的系统随机选择卡片。

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)即可获得所需的结果。

3 个答案:

答案 0 :(得分:0)

您可以将所有对象放入如下列表中:

objectList = [ace_h, two_h, three_h]
random_1 = random.choice(objectList)

然后打印您想要的属性:

print(random_1.face)

答案 1 :(得分:0)

有几种方法你可以立即想到这样做。

  1. 您可以更改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对象的引用,而不是它们的名称。这可能是最简单的方法。

  2. 您可以按名称访问全局变量。这有点复杂,可能不是你想要的,但这项技术可以用于其他事情:

    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_hcards[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检查它们是否是同一个对象。