在Python中显式创建一个新对象

时间:2013-12-04 14:53:26

标签: 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

我得到以下输出:

['bananas contain potassium', 'These are some facts about oranges', 'Unrecognized fruit submitted']
['bananas contain potassium', 'These are some facts about oranges', 'Unrecognized fruit submitted']
['bananas contain potassium', 'These are some facts about oranges', 'Unrecognized fruit submitted']

现在我怀疑发生的事情是我没有按照我想要的方式显式创建三个对象,而只是将字典中的所有三个项目指向同一个对象。我的问题是:为什么?在循环的每次传递中,File应该具有不同的值。更重要的是,如何绕过它?在我的“真实”代码中,创建一个全新的变量来存储每个对象是不切实际的。

感谢您的帮助。

凯西

4 个答案:

答案 0 :(得分:3)

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

class Fruit:

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

   def addfact(self, FruitName):
       ...

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

答案 1 :(得分:0)

试试这个:

class Fruit:
   name = ''
   # remove this string facts = [] 
   def __init__(self, FruitName):
       self.name = FruitName
       self.facts = [] # add "self."
   ...

在您的示例中,事实是类成员(不是实例成员)

答案 2 :(得分:0)

facts被定义为类属性,即由类的所有实例共享。在__init__

中移动作业
def __init__(self, name):
    self.name = name
    self.facts = []

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

def addfact(self, fact):
    self.facts.append(fact)

答案 3 :(得分:0)

类变量和实例变量之间存在差异。 请考虑以下事项:

>>> 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]

该类的实例将继承类变量。如果为实例更改它,它会将其保留为实例变量,更改为类变量无关紧要。如果在类中更改它,并且从未在实例中更改它。实例将看到类变量的更新值。