我正在用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()
运行代码段后,出现错误“未定义广告列表”。
答案 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
等等,要好...