我试图创建一个包含字典作为属性的类,以及将元素添加到字典并显示字典包含的所有元素的方法。 所以我尝试了这个:
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中没有通过引用传递字典。
谢谢
答案 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)
如果其中任何一项不清楚,我建议您阅读以下内容
Intro to Modules, Classes, and Objects
答案 2 :(得分:0)
您误解了类和实例的工作方式。每次调用catalogue()
时,都会得到一个 new 实例:这就是括号的作用,它们会调用构造新实例的类。
而不是catalogue = Catalogue
然后catalogue().addElement
,你应该这样做:
catalogue = Catalogue()
catalogue.addElement(item, price)
catalogue.showElements()
答案 3 :(得分:0)
创建目录变量时:
catalogue = Catalogue
您没有构建目录对象,只需创建一个变量catalogue
即Catalogue
类的引用,因此当您尝试访问您的函数时,您可以真正创建两个不共享任何值的新目录对象:
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