Python报错type object 'Graph' has no attribute 'nodes'问题问询
报错原因及修复方案
核心报错原因
type object 'Graph' has no attribute 'nodes'报错的本质是混淆了Python中类属性和实例属性的区别:
你在Graph类的__init__构造方法中定义的self.nodes是实例属性,只有调用Graph()创建出类的实例之后,这个属性才会绑定到实例对象上,Graph类本身是没有nodes这个属性的。
存在的其他关联问题
add_node是定义在Graph类中的实例方法,第一个参数self需要传入类的实例对象,你直接用Graph.add_node(name)调用会缺少self参数,即使修复了nodes属性的问题也会触发新的参数不匹配报错。- 你粘贴的代码中存在多处缩进错误,Python严格要求缩进对齐,构造方法、函数内的逻辑代码都需要比上层定义多缩进4个空格,否则会直接触发语法错误。
标准修复方案
步骤1:先实例化Graph类
创建一个全局的Graph实例,所有节点、边的操作都针对这个实例执行:
# 实例化Graph,得到实例对象 graph = Graph()
步骤2:修改addrouter函数,替换类调用为实例调用
def addrouter(name: AddRouter): # 操作实例的nodes属性,而不是类的属性 if name not in graph.nodes: # 调用实例的add_node方法,会自动传入self参数 graph.add_node(name) return "success" else: return "Error, node already exists"
替代方案(全局单一场景适用)
如果你的程序全程只需要一个图结构,不需要多个独立的Graph实例,可以直接将nodes、edges定义为类属性,不需要放到__init__方法中:
class Graph: # 类属性,所有实例共享,类本身也可以直接访问 nodes = [] edges = [] def add_node(self, name): if name in self.nodes: return -1 self.nodes.append(name) return 0
这种场景下你原来的调用逻辑也需要同步调整,要么继续使用实例调用,要么将add_node也改为@classmethod类方法支持直接通过类调用。
内容的提问来源于stack exchange,提问作者ClarkeJ2000
相关产品推荐
相关产品推荐

