理解Python类实例

理解Python类实例,python,class,sum,Python,Class,Sum,我正在研究一个使用python类的问题,它有一个构造函数来给出一个骰子的边数,还有一个函数来滚动骰子,并根据边数返回一个随机数。我意识到代码非常基本,但我很难理解如何总结三个不同侧面的骰子。既然变量正在传递函数实例,那么获取该值并将其相加的最佳方法是什么?这是我的 *为了澄清。。。我可以将roll1.roll_dice()的总数相加,但我必须单独显示每个骰子,然后显示三个骰子的总数。我可以做其中一个,但不能同时做两个 class Die(): def __init__(self

我正在研究一个使用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()

由于
roll\u die
返回一个值,因此可以添加这些值

试试这个

roll1.roll_die() + roll2.roll_die()

发生了什么事?

你可以把这些数字相加。如果要汇总N个卷的结果,请考虑将此函数添加到类:

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

也可以考虑重命名滚动骰子来滚动。很明显,这与滚动岩石无关,因为该方法是类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))

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

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

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

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

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)

。。。然后用列表等让爱好者更喜欢。

我想我会这样做:

# 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()

它也可能是有用的,只是存储最后一卷,这样你就可以随时得到它

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

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

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

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()
让我们疯狂吧:)(再加上我最后的答案)


我想我应该澄清一下。。。我可以得到这些卷的值,但是我必须分别显示每个卷,然后是三个卷的总数。因此,如果我像你那样把卷子加起来,我可以得到一个总数,但不是每个卷子的值。+1可能不是课堂项目所要求的:)总是喜欢和CompSci老师的头捣乱。这是可行的,尽管我们必须“创建三个骰子,第一个没有说明边的数目”,所以它采用构造函数的默认值(6)而不是打电话给6。有没有办法在列表中传递一个空值?有关这个特定问题的信息,请参阅第25章。对总数使用类attr似乎是一个奇怪的副作用。特别是在两个不同的玩家掷同一组骰子的游戏中。你会得到奇怪的副作用,而且你必须记住将其重置为零。没错,但这不是Jb描述的用例(也许他应该澄清),我不同意用“奇怪”或“副作用”这样的术语来描述这个解决方案。顺便说一句,设置为零可能是由getter.Hmm自动完成的。谢谢各位。我也在想chmod700说了些什么。接下来的三个模具也将被总结,我需要它被重置。是的,我应该澄清一下。我想我只是不喜欢用类变量来做这类事情。然后,这个类的用户必须记住他们使用的每个地方,以确保他不会在总数中增加额外的内容。这就是我所说的副作用。我的问题是,当我回忆起这个例子时,我得到的结果与我掷的骰子不同,因为它是对三个不同的骰子的总和。我没有想到求和函数。。。这正是我需要的。有时候最简单的事情也会变得很棘手。谢谢,很乐意帮忙。(但我没有提到sum(),其他人提到了…)
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)