在Python中显式创建新对象

2024-10-04 11:34:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建新对象并将它们存储在词典中。但它似乎并没有像我期望的那样工作。在

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应该有一个不同的值。更重要的是,我如何避开它?在我的“真实”代码中,创建一个全新的变量来存储每个对象是不实际的。在

谢谢你的帮助。在

凯西


Tags: 对象nameselfifdeffilebananaprint
3条回答

facts定义为类属性,即由类的所有实例共享。将赋值移到__init__内:

def __init__(self, name):
    self.name = name
    self.facts = []

此外,类定义似乎不是存储事实的正确位置,当然它们应该是addfact的参数,在这里您已经可以使用self.name访问名称:

^{pr2}$

类变量和实例变量之间有区别。 考虑以下因素:

>>> class Test:
...     facts = [1]
...     def __init__(self,v=None):
...             if v:
...                     self.facts = v
... 
>>> t = Test()
>>> t.facts
[1]
>>> Test.facts
[1]
>>> Test.facts = [2]
>>> t.facts
[2]
>>> t2 = Test([3])
>>> t.facts
[2]
>>> t2.facts
[3]
>>> Test.facts
[2]
>>> Test.facts = [4]
>>> t.facts
[4]
>>> t2.facts
[3]

类的实例将继承类变量。如果您为实例更改它,它将保留它作为实例变量,对类变量的更改无关紧要。如果在类中更改它,而从未在实例中更改它。实例将看到类变量的更新值。在

问题是facts是一个类变量,而不是一个实例变量。您应该在__init__中定义它(并删除那里无用的局部变量声明):

class Fruit:

   def __init__(self, FruitName):
       self.name = FruitName
       self.facts = []

   def addfact(self, FruitName):
       ...

注意Python不是Java,不需要在类级别“声明”属性。在

相关问题 更多 >