0

以下のコードがどのように機能するのか理解できません。

class Host:
    name = None
    fileList = []
    def __init__(self, hostName):
        self.name = hostName    
    def AddInfo(self,file):
        self.fileList.append(file)          
    def Cleanup(self):
        self.fileList   = []

2つのインスタンスを作成します。

h1 = Host("hostName1")
h1.AddInfo("h1")
h1.Cleanup()
print h1.fileList, Host.fileList

h2 = Host("hostName2")
h2.AddInfo("h2")
print h2.fileList, Host.fileList

結果は次のとおりです。

h1.fileList = [], Host.fileList = ['h1']
h2.fileList = ['h1', 'h2'], Host.fileList = ['h1', 'h2']

値が変更される理由Host.fileList-インスタンスにのみ新しい値を割り当てましたか?なぜそのような価値があるのですか?私はここh2.fileListで期待していましたか?['h2']

4

3 に答える 3

3

これは基本的なPythonです(「PythonはJavaではありません」のように)。

クラスレベルで宣言された属性は、インスタンス属性ではなく、クラス属性です。インスタンス属性を宣言するには、で行うように、メソッド内に直接割り当てselfます。self.name__init__

于 2012-07-02T14:46:02.087 に答える
2

クラススコープの変数は、クラスによって定義されます。で変数を作成する必要があります__init__

def __init(self, hostName):
    self.name = hostName
    self.fileList = []
于 2012-07-02T14:47:29.540 に答える
2

これはおそらく、コードをステップスルーすることで簡単に確認できます。

h1 = Host("hostName1")  #After __init__:h1.filelist -> Host.filelist
h1.AddInfo("h1")        #After AddInfo: h1.filelist -> Host.filelist
h1.Cleanup()            #After Cleanup: h1.filelist is a new list

h2 = Host("hostName2")  #After __init__:h2.filelist -> Host.filelist (which already has 'h1' inserted)
h2.AddInfo("h2")        #After AddInfo: h2.filelist -> Host.filelist

メソッド内で、を使用する場合self.filelist、Pythonはインスタンスがfilelist最初に属性を持っているかどうかを確認します。インスタンスにその属性がない場合、Pythonはインスタンスが属するクラスの属性を探します。で行うときはself.filelist=[]Cleanupインスタンスに属性を与えますfilelist

于 2012-07-02T14:49:47.027 に答える