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

Python中实现带历史记录的属性链访问需求

解决方案:实现元素访问链与历史记录跟踪

核心思路

将元素的关系定义和访问路径跟踪分离:

  • Element类仅负责存储元素名称、允许的跟随关系,以及基础方法(如help)
  • 新增Path类作为包装器,每个Path实例对应一条访问路径,独立维护访问历史,同时处理属性访问和自动补全逻辑

代码实现

class Element:
    def __init__(self, name):
        self.name = name
        self.followers = {}  # 存储当前元素允许跟随的其他Element实例

    def add_follower(self, follower):
        self.followers[follower.name] = follower

    def help(self):
        return f"Help for {self.name}"

class Path:
    def __init__(self, element, history=None):
        self.element = element
        # 初始化历史记录,默认包含当前元素名称
        self.history = history or [element.name]

    def __getattr__(self, attr):
        # 处理元素访问:将小写属性名转为大写,匹配Element的名称
        element_name = attr.upper()
        if element_name in self.element.followers:
            next_element = self.element.followers[element_name]
            # 创建新的Path实例,追加当前元素到历史记录
            return Path(next_element, self.history + [next_element.name])
        
        # 处理方法调用:转发help和history方法
        if attr == 'help':
            return lambda: self.element.help()
        if attr == 'history':
            return lambda: self.history.copy()
        
        raise AttributeError(f"'Path' object has no attribute '{attr}'")

    def __dir__(self):
        # 返回可补全的属性列表,支持REPL自动补全
        # 包含允许跟随的元素小写名称,以及可用方法名
        follower_attrs = [name.lower() for name in self.element.followers.keys()]
        return follower_attrs + ['help', 'history']

# 初始化元素关系
element_a = Element('A')
element_b = Element('B')
element_c = Element('C')

element_a.add_follower(element_b)
element_a.add_follower(element_c)
element_b.add_follower(element_a)
element_c.add_follower(element_a)

# 创建入口Path实例
a = Path(element_a)

功能验证

  • 访问链调用:a.b.a.c.help() 返回 'Help for C'
  • 历史记录查询:a.b.a.c.history() 返回 ["A", "B", "A", "C"]
  • REPL自动补全:输入a.时会显示b、c、help、history;输入a.b.时会显示a、help、history,完全符合需求

方案优势

  1. 解决单例节点的历史冲突问题:每个访问路径对应独立的Path实例,历史记录互不干扰,不再受Element单例的限制
  2. 原生支持REPL自动补全:通过__dir__方法暴露合法的属性和方法,REPL能自动提示后续可访问的元素
  3. 职责清晰:Element专注于关系定义,Path专注于路径跟踪,代码结构更易维护

内容的提问来源于stack exchange,提问作者rgo85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:12:55