unittest testcase设置新对象

时间:2013-07-17 11:52:00

标签: python eclipse class pydev instantiation

我在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}

2 个答案:

答案 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是该对象的成员。如果更改其值,则更改类的定义。因此,下次从该类创建对象时,它将具有新值。如果在构造函数中设置值,则它将仅是该对象的成员。