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

如何实现可模拟所有方法、永不抛出AttributeError的自定义类

实现永不抛出AttributeError的通用方法模拟类

完全可以实现,Python 提供的__getattr__魔法方法刚好适配这个需求,具体实现如下:

代码实现

class UniversalCallableObject:
    def __init__(self, tip_template="调用了不存在的方法: {method_name}, 参数: 位置参数{args}, 关键字参数{kwargs}"):
        # 支持自定义提示模板
        self.tip_template = tip_template

    def __getattr__(self, method_name):
        # 访问不存在的方法时触发,返回适配任意参数的包装函数
        def method_wrapper(*args, **kwargs):
            # 打印指定提示
            print(self.tip_template.format(
                method_name=method_name,
                args=args,
                kwargs=kwargs
            ))
            # 可在此处自定义默认返回值,默认返回None
        return method_wrapper

使用示例

# 初始化实例,也可以传入自定义提示模板
demo_obj = UniversalCallableObject()

# 调用任意不存在的方法都不会抛出AttributeError
demo_obj.random_method()
demo_obj.calculate(1, 2, 3, operator="add")
demo_obj.send_msg(content="测试", receiver="admin")

实现原理

  • __getattr__是Python内置的实例魔法方法,仅当访问的属性/方法不在实例、当前类、父类的属性字典中时才会触发,不会影响已经存在的属性方法的正常调用。
  • 示例中返回了支持任意参数的包装函数,所以不管调用时传入多少位置参数、关键字参数都不会报错,还能完整捕获参数信息打印提示。
  • 如果需要适配普通属性的访问场景,不返回可调用对象,直接修改__getattr__的返回逻辑即可,比如直接打印提示后返回默认的属性值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:24:02