我无法理解下面的代码如何运作:
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']
?
答案 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
。