为什么属性在Python中跨类继承?

时间:2012-06-19 23:53:27

标签: python class attributes

我在学习如何正确使用课程时遇到了一些麻烦。我希望下面的代码循环遍历一组文件(它确实如此),在一个集合中添加元素(它确实如此),并在它移动到新文件时启动集合(它不< / em>的)。我在下面的代码中攻击的方式,我希望每次都为file.terminals返回一个空集,因为我相信每个集都是类{{1}的新实例的唯一属性}。显然,我错了。实际发生的是,第一个文件创建的终端集持续存在(并被添加到)列表中的所有后续文件,尽管其他属性(例如SrcFilefile.name)会随之改变。文件。有人可以解释为什么它以这种方式工作以及如何创建我期望的行为?提前感谢您对初级程序员的无知的耐心。

file.seqlength()

2 个答案:

答案 0 :(得分:4)

您正在类声明中定义terminals,而不是在为该类的每个新实例执行的__init__函数内定义。

基本上,terminals是为整个类初始化的,而不是为每个类的实例初始化:

>>> SrcFile.terminals
set([])

注意我运行了SrcFile.terminals,而不是SrcFile().terminals,这意味着SrcFile是对类的引用,而不是类的实例。

您将__init__函数中的变量放在其中以使它们特定于实例:

class SrcFile(object):
  def __init__(self, which):
    self.name = which
    self.terminals = set([])

答案 1 :(得分:3)

通过在类本身中定义terminals = set([]),在定义类时创建一次,而不是在创建实例时创建。

要避免这种情况,请将其删除,然后将以下内容添加到__init__方法中:

self.terminals = set()