在Python中,当尝试在方法上使用@property
装饰器结合__getattr__
时,可能会遇到TypeError
。以下是完整的分析:
__getattr__
方法:当访问不存在的属性时触发,需定义为实例方法。@property
装饰器:将方法转换为属性访问形式,自动调用被装饰的方法。直接修饰__getattr__
会导致冲突:
class Example:
@property
def __getattr__(self, name): # 错误用法
return f"Missing: {name}"
此时调用obj.xxx
会触发:
TypeError: __getattr__() missing 1 required positional argument: 'name'
因为@property
将方法转为无参属性访问,而__getattr__
需要name
参数。__getattr__
直接定义普通方法:
class Example:
def __getattr__(self, name):
return f"Missing: {name}"
若需属性访问控制,改用__getattribute__
或描述符:
class CustomDescriptor:
def __get__(self, obj, owner):
return lambda name: f"Custom: {name}"
class Example:
__getattr__ = CustomDescriptor()
| 方法 | 调用时机 | 参数要求 |
|---------------------|------------------------|---------------|
| 普通__getattr__
| 属性不存在时 | 必须接收name
|
| @property
方法 | 属性访问时 | 无参数 |
__getattr__
的设计初衷是处理动态属性访问,与@property
的静态属性特性冲突。理解Python描述符协议和属性访问优先级(__getattribute__
> __getattr__
)可避免此类问题。
没有搜到相关的文章