You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:06:08