首页
学习
活动
专区
圈层
工具
发布

修饰方法上的getattr会生成一个TypeError

在Python中,当尝试在方法上使用@property装饰器结合__getattr__时,可能会遇到TypeError。以下是完整的分析:

基础概念

  1. __getattr__方法:当访问不存在的属性时触发,需定义为实例方法。
  2. @property装饰器:将方法转换为属性访问形式,自动调用被装饰的方法。

错误原因

直接修饰__getattr__会导致冲突:

代码语言:txt
复制
class Example:
    @property
    def __getattr__(self, name):  # 错误用法
        return f"Missing: {name}"

此时调用obj.xxx会触发:

  • TypeError: __getattr__() missing 1 required positional argument: 'name' 因为@property将方法转为无参属性访问,而__getattr__需要name参数。

正确解决方案

方案1:避免修饰__getattr__

直接定义普通方法:

代码语言:txt
复制
class Example:
    def __getattr__(self, name):
        return f"Missing: {name}"

方案2:通过描述符实现复杂逻辑

若需属性访问控制,改用__getattribute__或描述符:

代码语言:txt
复制
class CustomDescriptor:
    def __get__(self, obj, owner):
        return lambda name: f"Custom: {name}"

class Example:
    __getattr__ = CustomDescriptor()

应用场景

  • 动态属性:如动态API调用代理
  • 兼容性处理:旧版本属性迁移时容错
  • 调试工具:记录未定义属性的访问

关键区别

| 方法 | 调用时机 | 参数要求 | |---------------------|------------------------|---------------| | 普通__getattr__ | 属性不存在时 | 必须接收name | | @property方法 | 属性访问时 | 无参数 |

总结

__getattr__的设计初衷是处理动态属性访问,与@property的静态属性特性冲突。理解Python描述符协议和属性访问优先级(__getattribute__ > __getattr__)可避免此类问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券