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.namein一样__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 回答