__getattr__
是 Python 中的一个特殊方法,用于在访问对象的属性时,如果该属性不存在,则会调用这个方法。这个方法提供了一种机制来动态地处理属性的访问,或者说是提供了一种“后备”的属性访问方式。
当尝试访问一个对象的属性时,Python 首先会在对象的实例字典中查找该属性。如果找不到,它会继续在类的字典中查找,然后是父类的字典,依此类推,直到找到属性或者到达基类 object
。如果所有的查找都失败了,Python 就会调用对象的 __getattr__
方法。
if
语句的需要。__getattr__
是一个实例方法,它接收一个参数,即尝试访问的属性名(以字符串形式)。
__getattr__
来实现。class DynamicAttributes:
def __init__(self):
self.known_attributes = {'a': 1, 'b': 2}
def __getattr__(self, name):
if name in self.known_attributes:
return self.known_attributes[name]
else:
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
# 使用示例
obj = DynamicAttributes()
print(obj.a) # 输出: 1
print(obj.b) # 输出: 2
try:
print(obj.c) # 抛出 AttributeError
except AttributeError as e:
print(e) # 输出: 'DynamicAttributes' object has no attribute 'c'
__getattr__
方法中不小心再次访问了不存在的属性,会导致无限递归。__getattr__
,可能会影响性能。__getattr__
中不会再次触发对自身的调用。可以使用 object.__getattribute__
来安全地访问实例的属性。__getattr__
中不会再次触发对自身的调用。可以使用 object.__getattribute__
来安全地访问实例的属性。通过这些方法,可以有效地使用 __getattr__
方法来增强类的功能,同时避免常见的问题。
领取专属 10元无门槛券
手把手带您无忧上云