Python:向类的字典属性添加元素不起作用

时间:2014-04-11 16:15:43

标签: python

我试图创建一个包含字典作为属性的类,以及将元素添加到字典并显示字典包含的所有元素的方法。 所以我尝试了这个:

class Catalogue:
    def __init__(self):    
        self.dictionary = dict()

    def addElement(self,name,price):
       if(self.dictionary.has_key(name)):
            print "This item is already in the catalogue. "
       else:
            print "The item ", name , "was added to the catalogue"
            self.dictionary[name] = price         

    def showElements(self):
        print "CATALOGUE: "
        print self.dictionary

然后在main函数中使用此类时,addElements()无法正常工作

catalogue = Catalogue

item  = raw_input("Name of the item: ")
price = raw_input("Price: ")

catalogue().addElement(item, price)

catalogue().showElements()

例如,如果我把item =“CD”,并且price =“1” 这些方法的输出是:

来自catalog()。addElements(item,price)

 The item CD was added to the catalogue
 {'CD', '1'}

但是当我使用catalog()。showElements()

 CATALOGUE:
 {}

似乎在方法addElements中没有通过引用传递字典。

谢谢

4 个答案:

答案 0 :(得分:3)

你的班级定义很好,这就是你使用它的方式。每次编写catalogue()时,您都在创建和访问新的Catalogue实例,因此每一行都在完全独立的对象上运行。

这一行:

catalogue = Catalogue

Catalogue类分配给名称catalogue不会创建实例。相反,使用:

catalogue = Catalogue()
                   # ^ important!

创建类Catalogue的新实例,并将该实例分配给名称catalogue

现在您可以使用该实例,例如:

catalogue.addElement(item, price)
       # ^ no parentheses here
catalogue.showElements()
       # ^ or here

答案 1 :(得分:1)

这是因为你没有正确地创建或调用类

如果您在调用此

后立即添加打印声明
catalogue = Catalogue
print catalogue

你会看到这个

__main__.Catalogue

这是因为您实际上catalogue引用了您的班级Catalogue。您需要将其更改为此以调用构造函数,以便您创建Catalogue对象的实例。

catalogue = Catalogue()

使用parantheses调用类名称调用默认构造函数。

然后当您调用方法时,每次都要创建新的Catalog对象,因为您再次使用括号

catalogue().addElement(item, price)

您需要像这样调用对象上的方法(没有括号)

catalogue.addElement(item, price)

如果其中任何一项不清楚,我建议您阅读以下内容

Python docs on Classes

Intro to Modules, Classes, and Objects

Guide to Speaking Object Oriented

Is-A, Has-A, Objects, and Classes

答案 2 :(得分:0)

您误解了类和实例的工作方式。每次调用catalogue()时,都会得到一个 new 实例:这就是括号的作用,它们会调用构造新实例的类。

而不是catalogue = Catalogue然后catalogue().addElement,你应该这样做:

catalogue = Catalogue() 
catalogue.addElement(item, price)
catalogue.showElements()

答案 3 :(得分:0)

创建目录变量时:

catalogue = Catalogue

您没有构建目录对象,只需创建一个变量catalogueCatalogue类的引用,因此当您尝试访问您的函数时,您可以真正创建两个不共享任何值的新目录对象:

catalogue().addElement(item, price) # this constructs a catalogue object

catalogue().showElements() # so does this

要解决此问题,只需将您的作业更改为构造函数

即可
catalogue = Catalogue()

catalogue.addElement(item, price) # this is now reference to above object
catalogue.showElements() # so is this