【问题标题】:Understanding Python Class instances了解 Python 类实例
【发布时间】:2009-03-29 02:19:23
【问题描述】:

我正在解决一个问题,它使用 python 类并具有一个构造函数来为一个骰子提供面数,以及一个根据面数返回随机数的函数来滚动骰子。我意识到代码非常基本,但是我很难理解如何总结三个不同面的骰子的总数。由于变量正在传递函数实例,因此获取该值以将其相加的最佳方法是什么?这就是我所拥有的。

*澄清一下...我可以将 roll1.roll_dice() 的总数加起来,但我必须单独显示每个掷骰,然后是三个骰子的总数。我可以做其中之一,但不能同时做。

class Die():

        def __init__(self, s = 6):
            self.sides = s
        def roll_die(self):
            x = random.randint(1,self.sides)
            return x

        roll1 = Die()   #Rolling die 1 with the default side of 6
        roll2 = Die(4)  #Rolling die 2 with 4 sides
        roll3 = Die(12) #Rolling die 3 with 12 sides

        print roll1.roll_die()  
        print roll2.roll_die()
        print roll3.roll_die()

【问题讨论】:

标签: python class sum


【解决方案1】:

您可以将结果存储在列表中:

rolls = [Die(n).roll_die() for n in (6, 4, 12)]

然后您可以显示单个结果

>>> print rolls
[5, 2, 6]

或将它们相加

>>> print sum(rolls)
13

或者,您可以保留一个累计:

total = 0
for n in (6, 4, 12):
    value = Die(n).roll_die()
    print "Rolled a", value
    total += value
print "Total is", total

(编辑以反映问题的更改/澄清)

【讨论】:

  • +1 可能不是课堂项目所需要的 :) 总是喜欢与 CompSci 老师的头搞混。
  • 这可行,虽然我们必须“创建三个骰子,第一个不说明边数”所以它从构造函数 (6) 中获取默认值而不是调用 6。有没有办法在列表中传递一个空值?
【解决方案2】:

我不确定你到底在哪里感到困惑。您需要做的最简单的事情是将您要滚动的特定骰子(对象)的概念与动作(滚动它)分开。我将从这里开始:

d6 = Die() #create die 1 with the default side of 6
d4 = Die(4) #create die 2 with 4 sides
d12 = Die(12) #create die 3 with 12 sides

roll1 = d6.roll_die()
roll2 = d4.roll_die()
roll3 = d12.roll_die()

print "%d\n%d\n%d\nsum = %d" % (roll1, roll2, roll3, roll1 + roll2 + roll3)

...然后对列表等更感兴趣。

【讨论】:

  • 我的问题是,当我回想实例时,我得到的总和与我滚动的骰子不同,因为它是三个不同骰子的总和。我没有想到 sum 函数……这正是我所需要的。有时最简单的事情可能会如此棘手。谢谢。
  • 很高兴为您提供帮助。 (但我没有提到 sum(),别人提到了……)
【解决方案3】:

只存储最后一卷也很有用,这样您就可以随时获取它。

def __init__(self, s = 6):
    self.sides = s
    self.last_roll = None

def roll_die(self):
    self.last_roll = random.randint(1,self.sides)
    return self.last_roll

【讨论】:

    【解决方案4】:

    由于roll_die 返回一个值,您可以添加这些值。

    试试这个。

    roll1.roll_die() + roll2.roll_die()
    

    会发生什么?

    【讨论】:

    • 我想我应该澄清一下...我可以得到这些卷的值,但我必须分别显示每个卷,然后显示三个卷的总和。因此,如果我像你一样将卷加起来,我可以得到一个总数,但不是每个卷的值。
    【解决方案5】:

    您可以将数字相加。如果您想对 n 次滚动的结果求和,请考虑将此函数添加到类中:

    def sum_of_n_rolls(self, n)
        return sum(self.roll_die() for _ in range(n))
    

    另外,考虑将 roll_die 重命名为 roll。很明显,这与滚石无关,因为该方法是 Die 类的一部分。


    编辑:我现在读到您需要打印中间卷。考虑:

    def n_rolls(self, n):
        return [self.roll_die() for _ in range(n)]
    

    现在你可以掷一个 7 面骰子 10 次:

    rolls = Die(7).n_rolls(10)
    print(rolls, sum(rolls))
    

    【讨论】:

      【解决方案6】:

      我想我会这样做:

      # Create dice
      sides = [6,4,12]
      dice = [Die(s) for s in sides]
      
      # Roll dice
      rolls = [die.roll_die() for die in dice]
      
      # Print rolls
      for roll in rolls:
          print roll
      

      如果您愿意,您还可以组合其中的几个步骤:

      for num_sides in [6,4,12]:
          print Die(num_sides).roll_die()
      

      【讨论】:

        【解决方案7】:

        如果我理解正确,您需要一个类属性。

        更新:添加了自动重置总数的方法

        import random
        
        class Die():
            _total = 0
        
            @classmethod
            def total(cls):
                t = cls._total
                cls._total = 0
                return t
        
            def __init__(self, s=6):
                self.sides = s
        
            def roll_die(self):
                x = random.randint(1,self.sides)
                self.__class__._total += x
                return x
        
        roll1 = Die()   #Rolling die 1 with the default side of 6
        roll2 = Die(4)  #Rolling die 2 with 4 sides
        roll3 = Die(12) #Rolling die 3 with 12 sides
        
        print roll1.roll_die()  
        print roll2.roll_die()
        print roll3.roll_die()
        print Die.total()
        print "--"
        print roll1.roll_die()  
        print roll2.roll_die()
        print roll3.roll_die()
        print Die.total()
        

        【讨论】:

        • 对总使用类属性似乎是一个奇怪的副作用。尤其是在两个不同的玩家掷同一组骰子的游戏中。你会得到奇怪的副作用,而且你必须记住将其重置为零。
        • 是的,但这不是 Jb 描述的用例(也许他应该澄清一下),我不同意像“奇怪”或“副作用”这样的术语适合描述这个解决方案。顺便说一句,设置为零可能会由吸气剂自动完成。
        • 嗯。多谢你们。我也在想chmod700说了什么。接下来的三个骰子也将被汇总,我需要将其重置。是的,我应该澄清这一点。我玩弄它。
        • 我想我只是不喜欢在这类事情上使用类变量。然后,此类的用户必须记住他们被使用的每个地方,以确保他的总数没有额外增加。这就是我所说的副作用。
        【解决方案8】:

        让我们发疯吧:)(也结合我的上一个答案)

        class Die():
            def __init__(self, s = 6):
                self.sides = s
                self.last_roll = None
        
            def roll_die(self):
                self.last_roll = random.randint(1,self.sides)
                return self.last_roll
        
        dice = map(Die, (6, 4, 12))
        rolls = map(Die.roll_die, dice)
        
        print rolls
        print sum(rolls)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-27
          • 1970-01-01
          • 2013-06-10
          • 2011-10-26
          • 1970-01-01
          • 2011-12-01
          • 2013-07-07
          • 1970-01-01
          相关资源
          最近更新 更多