我在Classic Eclipse 4.2.2中使用pydev和Python2.7。请在阅读时考虑下面的代码和结果。
假设我使用预定义值的变量创建对象。现在,假设我更改了这个值并创建了一个同名的新对象(即旧名称指向一个新对象)。我希望旧名称指向一个新对象,其值与类定义中给定的预定义值没有区别。事实并非如此。有什么建议吗?
代码:
class example(object):
veryImportantDict = {'A': 0}
def __init__(self):
pass
def set_veryImportantNumber(self,key,val):
self.veryImportantDict[key] = val
if __name__ == '__main__':
test = example()
print "New object: ", test
print "New object's dict: ",test.veryImportantDict
test.set_veryImportantNumber('A',5)
print "Old object's dict: ",test.veryImportantDict
test = example()
print "New object: ", test
print "New object's dict: ",test.veryImportantDict
返回:
New object: <__main__.example object at 0x0478C430>
New object's dict: {'A': 0} Old object's dict: {'A': 5}
New object: <__main__.example object at 0x0478C450>
New object's dict: {'A': 5}
答案 0 :(得分:0)
您将属性定义为类变量。 class vars将在该类的所有实例之间共享。您可以将其视为来自其他语言的静态属性。
您需要以这种方式将其定义为实例变量:
class example(object):
def __init__(self):
self.veryImportantDict = {'A': 0}
def set_veryImportantNumber(self,key,val):
self.veryImportantDict[key] = val
此外,在真正需要它们之前,不应该定义setter或getter方法。 Python作为改变这种行为的方法,如果你以后发现它是必要的,那么你可以避免繁琐的访问方法并直接访问属性,如下所示:
class example(object):
def __init__(self):
self.veryImportantDict = {'A': 0}
test.veryImportantDict['A'] = 'foo'
答案 1 :(得分:0)
通过在类定义中声明veryImportantDict
,您将其变为类变量。你想要的是创建一个实例变量。为此,您只需在构造函数中声明它。
你可以这样想:类声明本身就是一个对象。 veryImportantDict
是该对象的成员。如果更改其值,则更改类的定义。因此,下次从该类创建对象时,它将具有新值。如果在构造函数中设置值,则它将仅是该对象的成员。