【问题标题】:static class variables静态类变量
【发布时间】:2012-07-03 00:01:21
【问题描述】:

我不明白下面的代码是如何工作的:

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

【问题讨论】:

    标签: python static class-variables


    【解决方案1】:

    这可能很容易通过单步执行您的代码来查看:

    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 会在该实例所属的类上查找该属性。当您在Cleanup 中执行self.filelist=[] 时,您将赋予实例filelist 属性。

    【讨论】:

    • 你的意思是实例变量是在Cleanup中的“=”之后而不是self.fileList.append中创建的?
    • @Francheska -- 当然 self.fileList.append 不会创建新的实例变量。我不确定我是否理解你的评论。我已将After 添加到上面代码中的 cmets 中。这样就清楚了吗?
    【解决方案2】:

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

    def __init(self, hostName):
        self.name = hostName
        self.fileList = []
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我知道这个例子是模棱两可的——我永远不会真正使用这样的代码。我只是想了解为什么类级别变量 Host.fileList 在我的示例中具有这样的值?
      • 一点也不含糊,如果你想要一个类变量,你的代码就可以了。它有这个值是因为 Python 的语义是这样定义的:允许通过 self 访问类变量,但它仍然是类变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多