0

我在带有 Python2.7 的 Classic Eclipse 4.2.2 中使用 pydev。请在阅读时考虑下面的代码和结果。

假设我创建了一个具有预定义值变量的对象。现在,假设我更改了这个值并创建了一个同名的新对象(即,旧名称指向一个新对象)。我希望旧名称指向一个新对象,其值与类定义中给出的预定义值没有区别。事实并非如此。关于为什么的任何建议?

代码:

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}
4

2 回答 2

0

您将属性定义为类变量。类变量将在类的所有实例之间共享。您可以将其视为其他语言的静态属性。

您需要以这种方式将其定义为实例变量:

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'
于 2013-07-17T11:59:14.373 回答
0

通过veryImportantDict 在类定义中声明,您将其设为类变量。您想要的是创建一个实例变量。为此,您只需在构造函数中声明它。

你可以这样想:类声明本身就是一个对象。veryImportantDict是该对象的成员。如果你改变它的值,你就改变了类的定义。因此,下次您从该类创建对象时,它将具有新值。如果您在构造函数中设置值,则它将只是该对象的成员。

于 2013-07-17T12:01:07.563 回答