我正在尝试创建新对象并将它们存储在词典中。但它似乎并没有像我期望的那样工作。在
class Fruit:
name = ''
facts = []
def __init__(self, FruitName):
self.name = FruitName
facts = []
def addfact(self, FruitName):
if FruitName == 'banana':
self.facts.append('bananas contain potassium')
elif FruitName == 'orange':
self.facts.append('These are some facts about oranges')
else:
self.facts.append('Unrecognized fruit submitted')
Files = ['banana', 'orange', 'apple']
ObjLibrary = {}
for File in Files:
if not File in ObjLibrary:
ObjLibrary[File] = Fruit(File)
ObjLibrary[File].addfact(File)
print ObjLibrary['banana'].facts
print ObjLibrary['orange'].facts
print ObjLibrary['apple'].facts
我得到以下输出:
^{pr2}$现在我怀疑是我没有按照我想要的方式显式创建三个对象,而是将字典中的所有三个项指向同一个对象。我的问题是:为什么?在循环的每次循环中,File
应该有一个不同的值。更重要的是,我如何避开它?在我的“真实”代码中,创建一个全新的变量来存储每个对象是不实际的。在
谢谢你的帮助。在
凯西
facts
定义为类属性,即由类的所有实例共享。将赋值移到__init__
内:此外,类定义似乎不是存储事实的正确位置,当然它们应该是
^{pr2}$addfact
的参数,在这里您已经可以使用self.name
访问名称:类变量和实例变量之间有区别。 考虑以下因素:
类的实例将继承类变量。如果您为实例更改它,它将保留它作为实例变量,对类变量的更改无关紧要。如果在类中更改它,而从未在实例中更改它。实例将看到类变量的更新值。在
问题是
facts
是一个类变量,而不是一个实例变量。您应该在__init__
中定义它(并删除那里无用的局部变量声明):注意Python不是Java,不需要在类级别“声明”属性。在
相关问题 更多 >
编程相关推荐