如何实现可模拟所有方法、永不抛出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
相关产品推荐
相关产品推荐

