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

在子类__getattr__中调用父类__getattr__的最Pythonic方式是什么?

解决__getattr__中调用父类方法及属性转发问题

首先修正代码里的关键错误:你在__init__里把original_floor转成了字符串str(original_floor),这会丢失Floor实例的所有属性,无法后续访问它的方法或属性,所以第一步要把这行改成保留原实例:

this_hoos._floor = original_floor  # 去掉str()转换

接下来处理__getattr__里调用父类方法的问题:

Python中,当类没有显式指定父类时,默认继承object。object的__getattr__会在属性不存在时抛出标准的AttributeError,这是我们需要的默认行为。

你的需求应该是:当访问DrSeussHouse实例没有的属性时,先尝试从_floor实例中获取;如果_floor也没有该属性,就交给父类的__getattr__处理(抛出正确的异常)。

修正后的__getattr__实现如下:

def __getattr__(this_hoos, attr_name: str):
    # 尝试从_floor实例获取目标属性
    try:
        return getattr(this_hoos._floor, attr_name)
    except AttributeError:
        # 若_floor也没有该属性,调用父类的__getattr__抛出标准异常
        super().__getattr__(attr_name)

说明:

  • super().__getattr__(attr_name) 是调用父类(这里是object)的__getattr__方法的正确方式,不需要额外传递实例参数,super()会自动绑定当前实例上下文。
  • 用try-except捕获AttributeError,确保只有当_floor确实没有该属性时,才会触发父类的默认逻辑,避免误吞异常。

如果你的类是继承自自定义父类(而非object),调用父类__getattr__的方式完全一样,super()会自动找到继承链中的父类方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:12:48