1.getattr() 是 Python 的一个内置函数,用于获取对象的属性值
getattr(object, name[, default])
参数说明
object: 要获取属性的对象。name: 一个字符串,表示要获取的属性的名称。default(可选): 如果指定的属性不存在,返回这个默认值。如果未提供此参数且属性不存在,则会引发AttributeError异常。
返回值
返回对象指定属性的值。如果属性不存在且提供了 default,则返回 default;否则抛出 AttributeError。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"Hello, I'm {self.name}."
# 创建一个 Person 实例
person = Person("Alice", 30)
# 使用 getattr 获取属性值
name = getattr(person, 'name')
age = getattr(person, 'age')
greet_method = getattr(person, 'greet')
print(name) # 输出: Alice
print(age) # 输出: 30
print(greet_method()) # 输出: Hello, I'm Alice.
getattr(person, 'greet')获取person对象的greet方法(注意:这里获取的是方法本身,不是调用方法的结果)
2.在 Python 中,__getattr__ 是一个特殊方法(魔术方法),用于在访问对象的不存在的属性时被调用。它允许你自定义当尝试访问不存在的属性时的行为。
def __getattr__(self, name):
# name 是试图访问的不存在的属性名
# 返回一个值或引发 AttributeError
工作原理
- 当你尝试访问对象的属性(如
obj.attr)时,Python 首先会检查该属性是否存在 - 如果属性不存在,Python 会调用
__getattr__方法,并将属性名作为参数传递 - 你可以在
__getattr__中定义处理逻辑,返回一个值或引发AttributeError
class ProxyWrapper:
def __init__(self, target):
self._target = target
def __getattr__(self, name):
print(f"Accessing attribute: {name}")
return getattr(self._target, name)
def __getitem__(self, key):
# 支持字典的下标访问
return self._target[key]
real_obj = {'name': 'Alice', 'age': 30}
proxy = ProxyWrapper(real_obj)
print(proxy['name'])
print("..............")
print(proxy.get('age'))
-
proxy['name']:- 触发
__getitem__方法。 - 返回
real_obj['name']→'Alice'。
- 触发
-
proxy.get('age'):get不是ProxyWrapper的属性,所以触发__getattr__。- 调用
getattr(real_obj, 'get'),即real_obj.get方法。 - 然后传参
'age',等价于real_obj.get('age')→30。
1556

被折叠的 条评论
为什么被折叠?



