Python的hasattr() getattr() setattr() 函数使用方法详解

本文详细介绍了Python中如何使用hasattr(), getattr(), setattr()三个内置函数来检查、获取和设置对象的属性或方法,并通过示例代码展示了它们的具体应用。

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

Python的hasattr() getattr() setattr() 函数使用方法详解

hasattr(object, name)
判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。
需要注意的是name要用括号括起来

复制代码
 1 >>> class test():
 2 ...     name="xiaohua"
 3 ...     def run(self):
 4 ...             return "HelloWord"
 5 ...
 6 >>> t=test()
 7 >>> hasattr(t, "name") #判断对象有name属性
 8 True
 9 >>> hasattr(t, "run")  #判断对象有run方法
10 True
11 >>>
复制代码

getattr(object, name[,default])
获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,
可以在后面添加一对括号。

复制代码
 1 >>> class test():
 2 ...     name="xiaohua"
 3 ...     def run(self):
 4 ...             return "HelloWord"
 5 ...
 6 >>> t=test()
 7 >>> getattr(t, "name") #获取name属性,存在就打印出来。
 8 'xiaohua'
 9 >>> getattr(t, "run")  #获取run方法,存在就打印出方法的内存地址。
10 <bound method test.run of <__main__.test instance at 0x0269C878>>
11 >>> getattr(t, "run")()  #获取run方法,后面加括号可以将这个方法运行。
12 'HelloWord'
13 >>> getattr(t, "age")  #获取一个不存在的属性。
14 Traceback (most recent call last):
15   File "<stdin>", line 1, in <module>
16 AttributeError: test instance has no attribute 'age'
17 >>> getattr(t, "age","18")  #若属性不存在,返回一个默认值。
18 '18'
19 >>>
复制代码

 

setattr(object, name, values)
给对象的属性赋值,若属性不存在,先创建再赋值。

复制代码
 1 >>> class test():
 2 ...     name="xiaohua"
 3 ...     def run(self):
 4 ...             return "HelloWord"
 5 ...
 6 >>> t=test()
 7 >>> hasattr(t, "age")   #判断属性是否存在
 8 False
 9 >>> setattr(t, "age", "18")   #为属相赋值,并没有返回值
10 >>> hasattr(t, "age")    #属性存在了
11 True
12 >>>
复制代码

 

一种综合的用法是:判断一个对象的属性是否存在,若不存在就添加该属性。

复制代码
 1 >>> class test():
 2 ...     name="xiaohua"
 3 ...     def run(self):
 4 ...             return "HelloWord"
 5 ...
 6 >>> t=test()
 7 >>> getattr(t, "age")    #age属性不存在
 8 Traceback (most recent call last):
 9   File "<stdin>", line 1, in <module>
10 AttributeError: test instance has no attribute 'age'
11 >>> getattr(t, "age", setattr(t, "age", "18")) #age属性不存在时,设置该属性
12 '18'
13 >>> getattr(t, "age")  #可检测设置成功
14 '18'
15 >>>
复制代码

 

本文有参考其他博客

作者:岑宇
出处:http://www.cnblogs.com/cenyu/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。
>
18
1
currentDiggType = 0;
« 上一篇: Django博客功能实现—文章评论的显示
» 下一篇: Django博客功能实现—文章评论功能
posted @ 2016-07-28 10:11 岑宇 阅读( 71809) 评论( 5) 编辑 收藏

  
#1楼 2018-02-06 14:07 chaikau  
函数调用时会对各参数求值并压栈,所以getattr(t, “age”, setattr(t, “age”, “18”))是有问题的,不管实例有没有age属性setattr(t, “age”, “18”)都会被执行,t.age被赋值为”18”。
<think>我们被要求详细解释Python中的getattr函数,包括其使用方法和原理。根据引用内容,我们可以整合信息如下: 1. **功能描述**:`getattr()` 是Python的内置函数,用于获取对象的属性值。如果属性不存在,可以返回默认值,否则会引发AttributeError异常。 2. **基本语法**:`getattr(object, name[, default])` - `object`:要获取属性的对象。 - `name`:字符串,表示属性名。 - `default`(可选):当属性不存在时返回的默认值。若不提供且属性不存在,则触发AttributeError。 3. **与特殊方法的关系**: - 当访问对象的属性时,如果属性存在,Python会调用`__getattribute__`方法(注意不是`__getattr__`)来获取属性值。 - 如果通过`__getattribute__`没有找到属性(即引发AttributeError),并且对象定义了`__getattr__`方法,那么`__getattr__`方法会被调用(引用[1])。 - 注意:如果同时定义了`__getattribute__`和`__getattr__`,那么只有`__getattribute__`会被自动调用,除非`__getattribute__`中显式调用`__getattr__`或者抛出AttributeError(引用[1])。 4. **获取方法**:如果获取的是方法,`getattr`会返回该方法的引用(即内存地址),要调用该方法需要加上括号(引用[5])。 5. **动态性**:`getattr`常用于动态地获取属性或方法,特别是在编写框架或需要根据字符串名称来调用函数或访问属性的场景(引用[2]和引用[3])。 6. **示例**:引用[5]提供了一个示例,展示了如何使用`getattr`获取属性、方法以及处理属性不存在的情况。 根据以上信息,我们可以组织回答如下: ### Python getattr函数详解 `getattr()` 是Python的一个内置函数,用于动态获取对象的属性或方法。其核心原理是访问对象属性时,Python内部会调用特殊方法`__getattribute__`,如果属性未找到且定义了`__getattr__`方法,则会调用`__getattr__`方法[^1]。`getattr()`函数提供了直接访问对象属性的接口,并允许设置默认值以避免属性不存在时的异常。 #### 使用方法 函数语法为: ```python getattr(object, name[, default]) ``` - **object**:目标对象。 - **name**:字符串形式的属性名。 - **default**(可选):当属性不存在时返回的默认值。若省略此参数且属性不存在,则引发`AttributeError`。 ##### 示例1:获取属性 ```python class Test: name = "David" t = Test() print(getattr(t, 'name')) # 输出: David print(getattr(t, 'age', 18)) # 属性不存在,返回默认值18 ``` ##### 示例2:获取并调用方法 ```python class Test: def greet(self): return "Hello!" t = Test() method = getattr(t, 'greet') # 获取方法对象 print(method()) # 调用方法,输出: Hello! ``` ##### 示例3:处理不存在的属性 ```python class Test: pass t = Test() # 不提供默认值会引发异常 # getattr(t, 'missing') # AttributeError: 'Test' object has no attribute 'missing' # 提供默认值则返回默认值 value = getattr(t, 'missing', 'default_value') print(value) # 输出: default_value ``` #### 原理 1. **属性查找机制**:当调用`getattr(t, 'name')`时,Python首先调用`t.__getattribute__('name')`。如果找到属性,则返回;否则,如果定义了`t.__getattr__`方法,则调用`t.__getattr__('name')`[^1]。 2. **与`__getattr__`的区别**:`__getattr__`仅在属性未通过正常机制找到时调用,而`__getattribute__`总在访问属性时被调用(无论属性是否存在)。注意:`getattr()`函数的行为受这两个特殊方法的影响。 3. **动态特性**:`getattr`允许在运行时根据字符串动态获取属性或方法,这在需要灵活处理未知属性或实现插件系统、动态调用等场景非常有用(如引用[2]和[3]所述的多进程调用或类似celery的用法)。 #### 注意事项 - 如果对象同时定义了`__getattribute__`和`__getattr__`,则优先调用`__getattribute__`。若`__getattribute__`中未显式处理未找到属性的情况(即未抛出`AttributeError`),则不会触发`__getattr__`[^1]。 - 获取方法时,返回的是绑定方法(bound method)对象,需使用`()`调用。 §§相关问题§§ 1. `getattr`与`__getattr__`和`__getattribute__`有何区别与联系? 2. 如何使用`getattr`实现动态方法调用? 3. 在哪些实际应用场景中会使用`getattr`? 4. 如何避免滥用`getattr`导致的代码可读性问题? 以上内容综合了引用中的关键信息,并提供了清晰的示例和原理说明。</think>### Python `getattr` 函数详解 #### 一、基本概念 `getattr()` 是 Python 的内置函数,用于**动态获取对象的属性或方法**。其核心原理是通过字符串名称访问对象成员,实现运行时动态调用。 **语法**: ```python getattr(object, name[, default]) ``` - `object`:目标对象 - `name`:字符串形式的属性/方法名 - `default`:可选参数,属性不存在时返回的默认值 #### 二、工作原理 1. **属性查找流程**: - 当调用 `getattr(obj, 'x')` 时,Python 优先调用 `obj.__getattribute__('x')` - 若属性不存在,且对象定义了 `__getattr__` 方法,则调用 `__getattr__('x')`[^1] - 若未定义 `__getattr__` 且无默认值,抛出 `AttributeError` 2. **与特殊方法的关系**: ```mermaid graph LR A[getattr调用] --> B{属性存在?} B -- 是 --> C[调用__getattribute__] B -- 否 --> D{定义了__getattr__?} D -- 是 --> E[调用__getattr__] D -- 否 --> F[返回默认值或报错] ``` > 注意:Python 没有 `__setattribute__` 方法,属性赋值由 `__setattr__` 处理[^1] #### 三、使用方法 ##### 1. 基础属性获取 ```python class User: role = "admin" user = User() print(getattr(user, 'role')) # 输出: admin print(getattr(user, 'age', 25)) # 属性不存在,返回默认值 25 ``` ##### 2. 动态方法调用 ```python class Calculator: def add(self, a, b): return a + b calc = Calculator() method = getattr(calc, 'add') result = method(3, 5) # 等价于 calc.add(3, 5) print(result) # 输出: 8 ``` ##### 3. 结合模块使用 ```python import math sqrt_func = getattr(math, 'sqrt') print(sqrt_func(9)) # 输出: 3.0 ``` ##### 4. 安全访问嵌套属性 ```python class A: class B: value = 42 a = A() # 安全获取深层次属性 value = getattr(getattr(a, 'B', None), 'value', None) print(value) # 输出: 42 ``` #### 四、典型应用场景 1. **插件系统开发** 根据配置文件动态加载模块: ```python plugin_name = "pdf_export" plugin = __import__(f"plugins.{plugin_name}", fromlist=[""]) export_func = getattr(plugin, 'export') export_func(data) ``` 2. **REST API 路由** 动态调用控制器方法: ```python def handle_request(controller, action): func = getattr(controller, action, None) if callable(func): return func() return "Action not found" ``` 3. **数据序列化** 动态获取对象属性生成JSON: ```python def to_dict(obj): return {attr: getattr(obj, attr) for attr in dir(obj) if not attr.startswith('__')} ``` #### 五、注意事项 1. **性能考虑**:频繁动态调用可能影响性能,关键路径建议静态调用 2. **可读性**:过度使用会降低代码可读性,建议添加类型注释 3. **安全风险**:避免直接使用用户输入作为参数,防止任意代码执行 ```python # 危险示例(勿用): user_input = "delete_database" func = getattr(system, user_input) # 可能执行危险操作 ``` 4. **与`__getattr__`区别**: | 特性 | `getattr()` 函数 | `__getattr__` 方法 | |--------------|---------------------------|----------------------------| | 调用时机 | 显式调用 | 属性不存在时自动触发 | | 返回值 | 属性值/方法引用 | 需返回属性值 | | 默认值支持 | 支持(default参数) | 需手动处理异常 | #### 六、替代方案 1. 使用 `hasattr()` 进行前置检查: ```python if hasattr(obj, 'method'): getattr(obj, 'method')() ``` 2. 字典访问(适用于类字典对象): ```python value = obj.__dict__.get('attr', default) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值