内部班级彼此看不见?

时间:2018-08-03 03:25:52

标签: python python-3.x

我正在用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()

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

1 个答案:

答案 0 :(得分:0)

简短的版本是:您要在这里k.Adlist,而不是Adlist。这类似于以下事实:要访问属性,尽管细节不同,但不仅需要self.spam,还需要spam


中长版本为:

虽然类主体确实创建了名称空间,但它并不像函数主体一样。

特别是,类主体中的局部语言不能被该类主体中定义的类或函数捕获,而函数局部语言可以被该函数主体中定义的类r函数捕获的方式。

但是,当执行class语句时,该类主体的名称空间将成为该类对象的属性集。因此,您可以通过该类(或通过其任何实例,但在此不相关)访问这些变量。


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

  • __main__在任何地方都没有定义。您可能是说'__main__'
  • 您在array中创建的Graph.__init__只是一个局部变量,一旦返回__init__就会消失,因此没有人可以再次访问它。您可能想在这里self.array
  • head中的Adlist.__init__存在相同的问题。
  • printgraph函数不使用self参数,因此不能作为k实例上的方法来调用。
  • printgraph函数尝试访问名为array的东西,但是没有地方可以从中得到这样的东西。当然,类Graph的实例(如果您解决了第一个问题)具有array属性,但是k实例和任何Graph实例之间没有任何联系。据那个k对象知道,可能有300个Graph,或者根本没有。也许您希望这是一种Graph而不是k的方法?
  • l.Graph(5)创建一个Graph实例,然后立即将其丢弃。那不是很有用。
  • 虽然合法,但调用l.Graph而不是k.Graph可能会产生误导,对读者而言,这意味着特定实例l与{{ 1}},但实际上没有。

将它们放在一起:

Graph

当然,这只会打印五个空列表,但是比起修复后的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等等,要好...