当前位置:实例文章 » 其他实例» [文章]getattr, __getattr__, __getattribute__和__get__区别

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__()` 都是用于获取属性值的方法,但它们有不同的使用场景和行为。

相关标签:python开发语言
其他信息

其他资源

Top