Python getattr()、__getattr__ 简单结合实例

部署运行你感兴趣的模型镜像

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

工作原理

  1. 当你尝试访问对象的属性(如 obj.attr)时,Python 首先会检查该属性是否存在
  2. 如果属性不存在,Python 会调用 __getattr__ 方法,并将属性名作为参数传递
  3. 你可以在 __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

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值