python两组概念辨析:__getitem__ .vs. getitem __getattr__ .vs. getattr

news/2024/11/14 13:30:40/文章来源:https://www.cnblogs.com/smartljy/p/18543548

# python两组概念辨析:__getitem__ .vs. getitem & __getattr__ .vs. getattr

## 内容

在 Python 中,`__getitem__`、`__getattr__`、`getitem` 和 `getattr` 都是与对象属性访问和方法相关的概念,但是它们的作用和使用场景有很大的区别。下面我将详细分析它们之间的区别,并解释哪些是 Python 特有的。

### 1. `__getitem__` vs `getitem`

#### `__getitem__`
`__getitem__` 是 Python 中的一个特殊方法(也叫魔法方法或 dunder 方法),用于访问对象的元素。当你使用 `obj[key]` 这种语法时,Python 会调用对象的 `__getitem__` 方法来返回对应的元素。

- **用途**:当你想让一个对象支持像列表、字典、元组那样通过索引或键来访问其元素时,就需要实现 `__getitem__`。
- **示例**:

```python
class MyList:
def __init__(self, data):
self.data = data

def __getitem__(self, index):
return self.data[index]

my_list = MyList([1, 2, 3])
print(my_list[1]) # 输出: 2
```

- 在上面的例子中,`obj[1]` 会触发调用 `obj.__getitem__(1)`,返回列表的第 2 个元素。

#### `getitem`
`getitem` 不是 Python 的内置方法或特殊方法。它可能是你自己在代码中定义的一个函数,也可能是某些库的函数名称,和 `__getitem__` 没有直接关系。一般情况下,如果你看到 `getitem`,它可能是某个函数或工具方法的名称,但它不是 Python 的内建功能。

```python
def getitem(obj, index):
return obj[index] # 通过 __getitem__ 调用
```

总结:
- `__getitem__` 是特殊方法,用于实现通过索引访问元素。
- `getitem` 是普通的函数名称,通常由用户定义,不是 Python 内置的特殊方法。

### 2. `__getattr__` vs `getattr`

#### `__getattr__`
`__getattr__` 是 Python 中的另一个特殊方法。它在访问不存在的属性时被调用。只有当你访问一个对象的属性,而这个属性不存在时,Python 才会调用 `__getattr__`。

- **用途**:通过 `__getattr__` 可以定制对象的属性访问行为,通常用于延迟加载或动态创建属性。
- **示例**:

```python
class MyClass:
def __init__(self):
self.existing_attr = "I exist"

def __getattr__(self, name):
return f"Attribute {name} not found"

obj = MyClass()
print(obj.existing_attr) # 输出: I exist
print(obj.non_existing_attr) # 输出: Attribute non_existing_attr not found
```

- 在上面的例子中,当访问 `non_existing_attr` 时,Python 会调用 `__getattr__`,返回一个自定义的值。

#### `getattr`
`getattr` 是 Python 的内置函数,用于访问对象的属性。它的作用与 `obj.__getattr__(name)` 类似,但是 `getattr` 是一个普通函数,你可以显式地调用它,而不是依赖于 Python 自动触发。

- **用途**:`getattr` 用来安全地访问对象的属性,避免因属性不存在而抛出异常。它还可以提供一个默认值,如果属性不存在,则返回该默认值。
- **示例**:

```python
class MyClass:
def __init__(self):
self.existing_attr = "I exist"

obj = MyClass()
print(getattr(obj, 'existing_attr', 'Default Value')) # 输出: I exist
print(getattr(obj, 'non_existing_attr', 'Default Value')) # 输出: Default Value
```

- `getattr(obj, 'non_existing_attr', 'Default Value')` 先尝试获取 `obj` 的 `non_existing_attr` 属性,如果该属性不存在,返回 `'Default Value'`。

总结:
- `__getattr__` 是特殊方法,用于访问不存在的属性。
- `getattr` 是内置函数,用于安全地访问属性并提供默认值。

### 3. 总结

| 名称 | 用法 | 触发时机或用途 | 示例 |
|------------------|----------------------------------------|---------------------------------------------------|---------------------------------------------|
| `__getitem__` | 特殊方法,用于 `obj[key]` 语法访问元素 | 用于支持通过索引或键访问元素(例如字典、列表) | `obj.__getitem__(key)` |
| `getitem` | 普通函数或方法,不是 Python 内置的 | 可以作为普通函数定义,手动实现访问行为 | `getitem(obj, key)` |
| `__getattr__` | 特殊方法,用于访问不存在的属性 | 只有在访问一个对象的不存在属性时触发 | `obj.__getattr__(name)` |
| `getattr` | 内置函数 | 安全访问对象的属性,并可以提供默认值 | `getattr(obj, 'attr_name', 'default')` |

### 结论

- `__getitem__` 和 `__getattr__` 是 Python 的魔法方法,它们用于特定情况下的属性或元素访问。
- `getitem` 和 `getattr` 是普通的函数,`getitem` 不是 Python 内置的,而 `getattr` 是 Python 提供的内置函数。

希望这些解释帮助你理解它们之间的区别!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HyperWorks的shrink warp meshing

在HyperWorks中,针对某些具有复杂几何特征的零部件的网格剖分,Altair HyperMesh 向用户提供了一种名为 Shrink Warp Meshing 的技术,快捷高效地完成有限元模型前处理工作。例如在车辆碰撞分析研究中,用户可以使用 Shrink Warp Meshing 技术快速构建诸如传动系统等(具有复杂…

快速了解电源模块的使用方法 BDB10-12W系列电源模块

快速了解电源模块的使用方法 BDB10-12W系列电源模块电源是整个电路可靠工作的核心部分。然而,由于电源电路的电流和发热量较大,容易出现故障。今天我为大家介绍一下电源模块的使用方法。BOSHDIA电源模块是将电源电路集成到一个很小的PCB板上,从而实现输出稳定电压和大电流的…

GSDml结构

1. 如何方便的看到GSDml的结构在github上找到一个很好用的开源工具以及它的开源汉化,叫xml notepad,可以很好的看到设备树视图。 [2.9.0.8官方下载地址] [汉化插件]2. 文件结构总体就是header和Body两个部分ISO15745Profile | +--ProfileHeader +--ProfileBody|+--DeviceIdent…

什么是CRM系统?CRM系统在企业中扮演什么角色?

近年来,客户关系管理(CRM)系统逐渐显露头角,成为企业把握航向、驶向成功的关键。也有好多人来问关于这方面的问题,所以专门开一篇文章为大家深入了解CRM系统的含义、功能、价值以及它在现代企业中的实际应用,为的呀就是帮助大家全面把握这一概念。 一、CRM系统是什么? 客…

运行 MainApplication 时出错 运行 MainApplication 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行

运行springboot的启动类时,报了这个错。 解决办法: 1、修改选项2、添加缩短命令行项3、选择JAR清单

python 垃圾回收

引用计数器#define PyObject_HEAD PyObject ob_base; #define PyObject_VAR_HEAD PyVarObject ob_base;// 宏定义,包含 上一个、下一个,用于构造双向链表用。(放到refchain链表中时,要用到) #define _PyObject_HEAD_EXTRA \struct _object *_ob_next;标记清除 分…

作业4

作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist…

采集opc da 转 profinet IO项目案例

VFBOX协议转换网关支持PLC,modbus,EthernetIP,Profinet,CCLink,EtherCAT,IEC61850,IEC104,bacnet,DLT645,HJ212,opc ua,opc da,DNP3。目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 应用条件 2 4 查看OPC DA服务器的相关参数 2 5 配置网关采集opc da数据 4 6 用prof…

laravel PhpOffice 读取表格数据

/*** 更新安通船期* Description * Author Allen* Date 2024-11-11* @param Request $request [description]* @return [type] [description]*/public function updateAntongShipDate(Request $request){set_time_limit(0);$file = request()->file(file);if (em…

AI网关在企业系统应用中的角色和作用

在人工智能技术不断进步的今天,AI已成为推动全球经济增长的关键动力。预计到2027年,全球企业在AI技术上的支出将达到8000亿美元,年均增长率达到37.3%。这一趋势不仅改变了企业的业务模式,也对企业的安全策略提出了新的挑战,尤其是在构建、运行、扩展和保护AI应用程序及其底…

【python爬虫+情感分析】B站黑神话悟空热门弹幕情感分析及词云生成

黑神话悟空背景介绍 最近黑神话悟空这款游戏可谓红遍大江南北,不仅IGN给出了8分的高分,就连央视新闻都有报道。作为国内第一款单机大作:出圈的是游戏,输出的是中国文化,受到了广大游戏玩家的追捧和赞扬。 针对此热门事件,老王我用python爬虫和情感分析技术,针对B站的弹幕…

解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍后片刻再重试,或与系统管理员或技术支持联系“问题

当我们远程连接服务器连接不上并提示“为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍候片刻再重试,或与系统管理员或技术支持联系”时,根本原因是当前计算机远程连接时输入了过多的错误密码,触发系统策略自动锁定了。如果是你确定输入的密码没问题…