python魔术方法__setattr__、__getattr__解析

本文介绍了一个自定义的 AttrDict 类,该类继承自 Python 的内置 dict 类,并通过重写 __getattr__ 和 __setattr__ 方法实现了对字典键值对的属性式访问。示例代码展示了如何使用 AttrDict 来创建和访问带有默认属性的字典。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码示例:

class AttrDict(dict):
    def __getattr__(self, key):
        print ('called " __getattr__" ')
        return self[key]

    def __setattr__(self, key, value):
        print ('called "__setattr__" ')
        if key in self.__dict__:
            self.__dict__[key] = value
        else:
            self[key] = value

args = {'rec_nms_thresold': 0.5, 'batch_size': 1, 'image_shape': [3, 640, 640], 'threshold': 0.2}
args_dict = AttrDict(args)
print (args_dict.threshold)
args_dict.newAttr = '999'
print (args_dict.newAttr)

called " __ getattr __ "
0.2
called " __ setattr __ "
called " __ getattr __ "
999

参考链接:https://zhuanlan.zhihu.com/p/101004827?from_voters_page=true

Python 中,类中包含许多特殊的方法(有时称为魔术方法),它们以双下划线开头和结尾(即 `__method_name__`)。这些方法有特殊的含义,并允许你在类实例化、运算符重载以及其他关键事件发生时自定义行为。下面是一些常见的 `__方法` 示例及其用途: ### 1. 构造函数与初始化 - `__init__(self, ...)`: 初始化新创建的对象。当你使用类名加上圆括号的方式创建一个新的实例时会自动调用此方法。 ```python class MyClass: def __init__(self): print("Object initialized") ``` ### 2. 字符串表示形式 - `__str__(self)`: 返回一个易读的字符串表达式,默认情况下当打印对象或使用 str() 函数转换时会被调用。 - `__repr__(self)`: 类似于 `__str__()` ,但是更倾向于返回详细的调试信息,通常用于交互环境中显示对象的状态。 ```python class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"{self.name}, {self.age} years old" def __repr__(self): return f"Person(name={self.name!r}, age={self.age})" ``` ### 3. 运算符重载 - `__add__(self, other)` : 定义加法 (`+`) 行为。 - `__sub__(self, other)` : 定义减法 (`-`) 行为。 - 其他如乘法(`__mul__`)、除法(`__truediv__`)等也可以类似地实现。 ```python class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) ``` ### 4. 属性访问控制 - `__getattr__(self, name)` : 当试图访问不存在的属性时触发。 - `__setattr__(self, name, value)` : 设置任意属性之前都会被调用。 - `__delattr__(self, name)` :删除属性前调用。 ### 5. 可迭代协议 - `__iter__(self)` 和 `__next__(self)`:使得对象可以作为迭代器使用。 ```python class Counter: def __init__(self, low, high): self.current = low - 1 self.high = high def __iter__(self): return self def __next__(self): if self.current < self.high: self.current += 1 return self.current raise StopIteration() ``` 除了上述例子外还有许多其他有用的内置 `__方法__` 。了解并适当利用它们可以让Python代码更具表现力和灵活性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值