0

Python2.7でクラシック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

クラス定義で宣言veryImportantDict することにより、それをクラス変数にしています。必要なのは、インスタンス変数を作成することです。そのためには、コンストラクターで宣言するだけです。

このように考えることができます: クラス宣言自体はオブジェクトです。veryImportantDictそのオブジェクトのメンバーです。その値を変更すると、クラスの定義が変更されます。次にそのクラスからオブジェクトを作成すると、新しい値が設定されます。代わりにコンストラクターで値を設定すると、そのオブジェクトのメンバーのみになります。

于 2013-07-17T12:01:07.563 に答える