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())
我在这里找到了一个解决方案,但后来我意识到它是 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())