Python class 属性错误尽管存在?

Python class attribute error despite existing?

我在这里找到了一个解决方案,但后来我意识到它是 Python 2.7。我正在使用 Python 3.3.7,最近我一直在尝试使用 classes,我相信我可能最终把自己弄糊涂了。我有两个文件;我的 class 文件 (Dice.py):

class Dice:
    def __init__(self, sides):
        self.sides = sides

    @classmethod
    def roll(self):
        return self.sides + 2

还有我的主文件。

from Dice import Dice

Dice(int(input('How many sides are on the dice? ')))
print(Dice.roll())

理论上现在非常简单。但是,我 运行 遇到了一个奇怪的属性错误,这让我在这十行左右的代码上停留的时间比我愿意承认的要长得多。我不断收到“AttributeError:类型对象 'Dice' 没有属性 'sides' " 每次我尝试 运行 主文件时,理论上应该给我一个输入量 + 2 的答案。

我已经通过多种方式对其进行了初始化,添加了@class方法,重命名了属性等等;我只是无法摆脱这个错误。我想知道如果一开始它没有引用 init 函数,那么这个错误究竟意味着什么,以及我如何修复它以便它实际上可以 运行。谢谢!

编写class方法的更惯用的方法是

class Dice:
    ...

    @classmethod
    def roll(cls):
        ...

注意该参数通常称为 cls,而不是 self@classmethod 方法的作用是,当您调用 Dice.roll() 时,传递给该方法的 'instance' 是对象 Dice - 从字面上看,class 拥有该方法(不是 class 的任何特定实例)。这通常与继承和多态结合使用。

现在,由于 __init__() 从未在 Dice class 本身上调用过(它只会在 实例 上调用Dice class),Dice class 从来没有附加名为 sides 的属性。


在您的情况下,您可能希望 roll() 成为实例方法,并将新实例保存到变量中:

class Dice:
    def __init__(self, sides):
        self.sides = sides

    def roll(self):
        return self.sides + 2

die = Dice(int(input('How many sides are on the dice? ')))
print(die.roll())

# alternatively

sides = int(input('How many sides are on the dice? '))
print(Dice(sides).roll())