【发布时间】:2022-01-09 19:42:03
【问题描述】:
我需要制作一个用户应该能够定义的程序
- 骰子有几面
- 掷骰子的次数
- 有多少个骰子
我正在尝试构建基本结构。我从属性sides 和rolled 开始,它们将在我的主类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_diceis 在它被分配为实例属性的行上定义。作为一个子类,这并没有什么意义,它是Dice的集合,它本身不是Dice。而且我认为您的任何循环都没有意义,因为它们都从第一次迭代中返回 - 这里不应该有一些 random 行为吗? -
子类通常用于“类型”关系,而这种关系不是。此外,“Dice”是“Die”的复数 - 所以“Dices”作为一个词没有意义。
-
@jonrsharpe 我只是在里面循环,看看我打印时是否得到了我想要的值,它们只是为了测试。我现在正在检查随机行为,因为我正在考虑定义一个名为“rolling_output”的新函数。我正在创建 Dice(我知道,英语不好,但我试图使其复数)来定义会吸引“多个”骰子行为的功能。
-
我的意思是循环可以被简单地分解,而不是
for side in range(self.sides): return self.sides,使用...return self.sides。你唯一能得到的就是检查它是否是一个大于零的整数,并且有更多可读性和语义上合适的方法来做到这一点。