【问题标题】:Dice roller - Python OOP骰子滚轮 - Python OOP
【发布时间】:2022-01-09 19:42:03
【问题描述】:

我需要制作一个用户应该能够定义的程序

  1. 骰子有几面
  2. 掷骰子的次数
  3. 有多少个骰子

我正在尝试构建基本结构。我从属性sidesrolled 开始,它们将在我的主类Dice 中。我在这里假设我将永远有 1 个骰子。然后我创建了一个名为Dices(试图使其复数)的子类,它将继承Dice 类成员。

但是,我正在尝试引入一个名为 number_of_dice 的新属性,我还没有在我的主课程中设置它,它需要超过 1 个骰子。当我尝试打印 print(input_more_dice.number_dice()) 时,出现以下错误:

  in __init__
    self.number_of_dice = number_of_dice
NameError: name 'number_of_dice' is not defined

我确定我的设置不正确。这是我的(更新)代码:

import random 

# One dice result 
class Dice:
    sides = 0
    rolled = 0

    def __init__(self, sides, rolled):
        self.sides = sides
        self.rolled = rolled
        

    def rolling_output(self):
        

        if self.rolled == 1:
            rolled_once = random.randint(0, self.sides)
            return rolled_once
        else:
            list_of_results = [];
            for i in range(self.rolled):
                rolled_more = random.randint(0,self.sides)  
                list_of_results.append(rolled_more)

            return list_of_results  

# More than one Dice         
class Dices(Dice):
    number_of_dice = 0

    def __init__(self, number_of_dice):
        self.number_of_dice = number_of_dice

        super().__init__(sides= self.sides, rolled= self.rolled, number_of_dice= self.number_of_dice)

    def number_dice(self):
        return self.number_of_dice


# input_one_dice = Dice(3, 3)
# print(input_one_dice.rolling_output())    

input_more_dice = Dices(number_of_dice= 2)
print(input_more_dice.number_dice())
    



    

为什么我的子类不接受新属性?

【问题讨论】:

  • 子类是必须的吗?如果不是,我建议你只使用一个类。
  • 我从中得到的错误是TypeError: __init__() got an unexpected keyword argument 'number_of_dice' - number_of_dice is 在它被分配为实例属性的行上定义。作为一个子类,这并没有什么意义,它是Dice集合,它本身不是Dice。而且我认为您的任何循环都没有意义,因为它们都从第一次迭代中返回 - 这里不应该有一些 random 行为吗?
  • 子类通常用于“类型”关系,而这种关系不是。此外,“Dice”是“Die”的复数 - 所以“Dices”作为一个词没有意义。
  • @jonrsharpe 我只是在里面循环,看看我打印时是否得到了我想要的值,它们只是为了测试。我现在正在检查随机行为,因为我正在考虑定义一个名为“rolling_output”的新函数。我正在创建 Dice(我知道,英语不好,但我试图使其复数)来定义会吸引“多个”骰子行为的功能。
  • 我的意思是循环可以被简单地分解,而不是for side in range(self.sides): return self.sides,使用...return self.sides。你唯一能得到的就是检查它是否是一个大于零的整数,并且有更多可读性和语义上合适的方法来做到这一点。

标签: python class oop dice


【解决方案1】:

Dice类的“init”参数个数为2个(不包括self)。但是您尝试使用 3(不包括 self)参数在 Dice 中调用 Dice 类。是因为那个吗?我对面向对象编程不太熟悉。 return 在循环下也不能很好地工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2016-08-10
    • 2018-09-24
    • 1970-01-01
    • 2016-12-26
    • 2021-11-13
    • 2015-12-16
    相关资源
    最近更新 更多