【问题标题】:Inner classes cannot see one another?内部类不能互相看到?
【发布时间】:2018-08-03 03:25:52
【问题描述】:

我在python中实现Graph,我写了如下代码:

class k: 
    class Graph:
          def __init__(self,v): 
                 array=[Adlist() for i in range(v)] 
    class Adlist:
          def __init__(self):
                 head=[]
    def printgraph():
          for i in array:
                 print(i.head)
if __name__==__main__
     l=k()
     l.Graph(5) 
     l.printgraph()

运行代码部分后,出现错误“未定义广告列表”。

【问题讨论】:

  • 您遇到的错误是什么?您采取了哪些措施来解决问题?
  • 是的,我无法创建 Graph 对象。它显示未定义的 Adlist..
  • 请给我们一个minimal reproducible example。如所写,这会在__main__ 上引发NameError,我怀疑这是您要问的问题。并在问题中包含异常回溯,不要只是在评论中给我们一个模糊的描述。
  • Graph 除了持有array 之外还有什么其他作用吗?除了持有head 之外,Adlist 还做其他事情吗?
  • 问题很可能是Adlist()k 类的成员,必须使用限定名称引用:self.Adlist()k.Adlist()。如果是其他问题,请改进问题。

标签: python python-3.x


【解决方案1】:

简短的版本是:你想要k.Adlist,而不是Adlist。类似于当你想要访问一个属性时,你需要self.spam,而不仅仅是spam,虽然细节不同。


中长版是:

虽然类主体确实创建了命名空间,但它不像函数的主体。

特别是,类体内的局部变量不能被类体内定义的类或函数捕获,就像函数局部变量可以被函数体内定义的类 r 函数捕获一样。

但是,当class 语句被执行时,该类主体的命名空间就变成了类对象的属性集。因此,您可以通过类(或通过其任何实例,但这与此处无关)访问这些变量。


同时,您的代码还有多个其他问题:

  • __main__ 没有在任何地方定义。你可能是指'__main__'
  • 您在Graph.__init__ 中创建的array 只是一个局部变量,一旦__init__ 返回,它就会消失,因此没有人可以再次访问它。你可能想在这里self.array
  • Adlist.__init__ 中的head 有同样的问题。
  • printgraph 函数不采用 self 参数,因此它不能作为 k 实例上的方法调用。
  • printgraph 函数试图访问名为array 的东西,但它无处可取。当然,Graph 类的实例(如果你解决了第一个问题)有一个array 属性,但是k 实例和任何Graph 实例之间没有联系。据 k 对象所知,可能有 300 个 Graphs,或者根本没有。也许您希望这是Graph 的方法,而不是k 的方法?
  • l.Graph(5) 创建一个 Graph 实例,然后立即丢弃它。这不是很有用。
  • 调用l.Graph 而不是k.Graph 虽然是合法的,但可能有点误导——它向读者暗示特定实例lGraph 之间存在某种联系,但确实没有不。

把它们放在一起:

class k: 
    class Graph:
        def __init__(self, v):
            self.array = [k.Adlist() for i in range(v)] 
        def printgraph(self):
            for i in self.array:
                print(i.head)
    class Adlist:
        def __init__(self):
            self.head = []

if __name__ == '__main__':
     g = k.Graph(5) 
     g.printgraph()

当然,这只会打印五个空列表,但当您修复它时,这比 NameError 和另一个 NameError 更好......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2017-11-26
    • 1970-01-01
    • 2018-06-26
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多