静态类变量

时间:2012-07-02 14:42:56

标签: python static class-variables

我无法理解下面的代码如何运作:

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']

3 个答案:

答案 0 :(得分:3)

这是基本的Python(如“Python不是Java”)。

在类级别声明的属性是类属性,而不是实例属性。要声明实例属性,请直接指定方法内的self,就像使用self.name中的__init__一样。

答案 1 :(得分:2)

类范围中的变量由类定义。您应该在__init__

中创建变量
def __init(self, hostName):
    self.name = hostName
    self.fileList = []

答案 2 :(得分: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