我有一个程序,我打算在其中比较一个类的两个不同实例的字典内容(我打算将此作为比较FIB表的路由协议仿真),并且似乎在一个对象,另一个对象的字典更新了相同的信息。
class bar:
myName = ""
mydict1 = {'a': '', 'b': ''}
mydict2 = {}
def __init__(self, name):
self.myName = name
def addItem(self, x, y):
self.mydict2[x] = y
foo = bar('a')
foo.addItem('a', 'test')
print(foo.myName, foo.mydict2)
foo2 = bar('b')
print(foo2.myName, foo2.mydict2)
此输出为:
a {'a': 'test'}
b {'a': 'test'}
我不确定这是否是Python中的OOP怪癖,或者我是否缺少其他东西,感谢您的帮助!
答案 0 :(得分:2)
您在__init__
外部声明的所有属性都是 class 属性(由所有实例和类本身共享),而不是 instance 属性。如果您需要每个实例的唯一值,则必须在__init__
内部对其进行初始化,方法是将它们附加到self
(正在初始化的实例)上,例如:
class bar:
def __init__(self, name):
self.myName = name
self.mydict1 = {'a': '', 'b': ''}
self.mydict2 = {}
def addItem(self, x, y):
self.mydict2[x] = y
旁注:请阅读Python风格指南PEP8。您的命名约定显然与众不同,这使您的代码更难阅读(特别是,除了int
之类的内置代码外,基本上每个人都使用CapWords
作为类名,而lowercase
或lowercase_with_underscores
代表其他所有内容。
答案 1 :(得分:0)
由于mydict2
是在类中而不是在__init__
方法中分配的,因此它是类的属性,而不是对象的属性。要获得预期的行为,请在self.mydict2
方法中分配一个__init__
属性。
如果您习惯于Java之类的语言,这可能会令人惊讶。 Java中的行为是,当您在类中声明字段时,除非明确声明为static
,否则它属于实例,并且如果该字段具有初始化程序,则在创建对象时将执行初始化程序。 / p>
在Python中,创建类时将执行类主体中的所有代码。 (从技术上讲,这包括方法定义,但是请注意,执行方法定义只会导致方法被声明,而不是被调用。)由于代码仅执行一次,因此仅创建一个字典,并且该类保留对此的引用,尽管可以通过该类的任何实例访问此引用。