getattr, __getattr__, __getattribute__和__get__区别
发布人:shili8
发布时间:2025-01-09 22:10
阅读次数:0
**属性访问器函数与魔法方法**
在Python中,属性访问是程序设计中的一个基本概念。我们经常使用点运算符(.)来访问类的实例属性,如 `obj.attr`。然而,这个过程背后涉及到一些复杂的逻辑和机制。在本文中,我们将探讨四种相关但不同的方法:`getattr()`, `__getattr__()`, `__getattribute__()`, 和 `__get__()`。
### getattr()
`getattr()` 是一个普通函数,用于获取对象的属性值。它接受三个参数:第一个是对象本身,第二个是属性名(字符串),第三个是默认值(可选)。如果对象没有这个属性,则返回默认值。如果有这个属性,则返回其值。
def getattr(obj, name, default=None): return getattr(obj, name, default) class Test: def __init__(self): self.attr = 'value' test = Test() print(getattr(test, 'attr')) # 输出:'value' print(getattr(test, 'non_existent_attr', 'default')) # 输出:'default'
### __getattr__
`__getattr__()` 是一个特殊方法,用于在对象没有属性时提供默认值或进行其他处理。它接受两个参数:第一个是自身(self),第二个是属性名(字符串)。如果对象有这个属性,则直接返回其值。如果没有,则执行 `__getattr__()` 方法。
class Test: def __init__(self): self.attr = 'value' def __getattr__(self, name): if name == 'non_existent_attr': return 'default' else: raise AttributeError(f"'Test' object has no attribute '{name}'") test = Test() print(test.attr) # 输出:'value' print(test.non_existent_attr) # 输出:'default'
### __getattribute__
`__getattribute__()` 是一个特殊方法,用于获取任意属性的值。它接受两个参数:第一个是自身(self),第二个是属性名(字符串)。这个方法在 `__getattr__()` 之前被调用。
class Test: def __init__(self): self.attr = 'value' def __getattribute__(self, name): print(f"Getting attribute '{name}'") return super().__getattribute__(name) test = Test() print(test.attr) # 输出:'value',然后输出:Getting attribute 'attr'
### __get__
`__get__()` 是一个特殊方法,用于获取任意属性的值或进行其他处理。它接受三个参数:第一个是自身(self),第二个是属性名(字符串),第三个是默认值(可选)。这个方法在 `__getattr__()` 之前被调用。
class Test: def __init__(self): self.attr = 'value' def __get__(self, instance, owner): if instance is None: return self else: raise AttributeError(f"'Test' object has no attribute '{instance}'") test = Test() print(test.attr) # 输出:'value' try: print(test.non_existent_attr) except AttributeError as e: print(e) # 输出: 'Test' object has no attribute 'non_existent_attr'
综上所述,`getattr()`, `__getattr__()`, `__getattribute__()`, 和 `__get__()` 都是用于获取属性值的方法,但它们有不同的使用场景和行为。