Python3 getattr, getattrubute 区别和应用场景

Python
# -*- coding: utf-8 -*- """ @Time: 2018/4/30 @Author: songhao @微信公众号: zeropython @File: demo_getattr.py """ """ getattr, getattrubute getattr 在查找不到属性的时候调用 class User: def __init__(self,name): self.name =name def __getattr__(self, item): return ("not find atter") if __name__ == '__main__': user= User("songhao") print(user.age) print(user.name) 输出结果 # not find atter # songhao class User: def __init__(self, name, info={}): self.name = name self.info = info def __getattr__(self, item): return self.info[item] if __name__ == '__main__': user = User("songhao",info={"weixin":"zeropython"}) print(user.weixin) 输出: # zeropython class User: def __init__(self, name, info={}): self.name = name self.info = info def __getattr__(self, item): return self.info[item] def __getattribute__(self, item): # 调用属性最优先调用这个属性 return "hello world" if __name__ == '__main__': user = User("songhao",info={"weixin":"zeropython"}) print(user.weixin) 输出: #hello world
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# -*- coding: utf-8 -*-
"""
@Time: 2018/4/30
@Author: songhao
@微信公众号: zeropython
@File: demo_getattr.py
"""
"" "
getattr, getattrubute
getattr 在查找不到属性的时候调用
class User:
    def __init__(self,name):
        self.name =name
 
    def __getattr__(self, item):
        return (" not find atter ")
 
 
if __name__ == '__main__':
    user= User(" songhao ")
    print(user.age)
    print(user.name)
输出结果
# not find atter
# songhao
 
class User:
    def __init__(self, name, info={}):
        self.name = name
        self.info = info
 
    def __getattr__(self, item):
        return self.info[item]
 
 
if __name__ == '__main__':
    user = User(" songhao ",info={" weixin ":" zeropython "})
    print(user.weixin)
 
输出:
# zeropython
 
class User:
    def __init__(self, name, info={}):
        self.name = name
        self.info = info
 
    def __getattr__(self, item):
        return self.info[item]
 
    def __getattribute__(self, item):
       # 调用属性最优先调用这个属性
        return " hello world "
 
 
if __name__ == '__main__':
    user = User(" songhao ",info={" weixin ":" zeropython" } )
     print ( user . weixin )
 
输出:
#hello world

 

Python
#!/usr/bin/env python3 # -*- coding: utf-8 -*- class Student(object): def __init__(self): self.name = 'Michael' def __getattr__(self, attr): if attr=='score': return 99 if attr=='age': return lambda: 25 raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr) s = Student() print(s.name) print(s.score) print(s.age()) # AttributeError: 'Student' object has no attribute 'grade' print(s.grade)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
class Student ( object ) :
 
     def __init__ ( self ) :
         self . name = 'Michael'
 
     def __getattr__ ( self , attr ) :
         if attr == 'score' :
             return 99
         if attr == 'age' :
             return lambda : 25
         raise AttributeError ( '\'Student\' object has no attribute \'%s\'' % attr )
 
s = Student ( )
print ( s . name )
print ( s . score )
print ( s . age ( ) )
# AttributeError: 'Student' object has no attribute 'grade'
print ( s . grade )

有更高追求的建议读读源码

https://github.com/michaelliao/sinaweibopy/blob/master/weibo.py#L307

 

 

参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319098638265527beb24f7840aa97de564ccc7f20f6000

 




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
<think> 我们正在讨论Pythongetattr方法。根据用户要求,需要参考站内引用,但用户的问题是关于getattr的作用,且引用中提到了getattr的相关使用示例。 因此,我们将围绕getattr的作用展开,并参考引用内容。 关键点: 1. getattrPython内置函数,用于动态获取对象的属性。 2. 它通过字符串形式的属性名来访问属性,这在编写灵活代码时非常有用。 3. 可以设置默认值,当属性不存在时返回默认值而不抛出异常(可选)。 4. 可以触发对象的__getattr__方法(如果存在)。 根据引用内容: 引用[1]:getattr是动态获取对象属性,通过字符串属性名访问。 引用[2]:当属性在实例字典中找不到时,会调用__getattr__方法,而getattr可以触发这个过程。 引用[3]:展示了使用getattr调用方法直接调用的区别。 引用[4]:给出了一个示例,展示了getattr的基本用法设置默认值。 因此,我们可以这样组织回答: 1. 基本作用:动态获取属性。 2. 语法:getattr(object, name[, default]) 3. 工作流程:先查找对象是否有该属性,有则返回,没有则看是否有__getattr__方法,有则调用,没有则看是否提供了默认值,有则返回默认值,没有则抛出AttributeError。 4. 应用场景:动态调用属性或方法,处理不确定属性名的情况,实现委托等设计模式。 5. 注意事项:与直接访问属性的区别,以及使用默认值避免异常的好处。 同时,生成相关问题。 注意:回答中要自然地添加引用标识(引用内容已经在用户提供的引用中,我们只需在相应地方标注引用来源)。 </think> ### Python `getattr()` 方法详解 `getattr()` 是 Python 内置的核心函数,用于**动态获取对象的属性或方法**。它允许你通过字符串形式的属性名来访问对象成员,实现了属性访问的运行时动态化[^1]。 #### 核心功能与语法 ```python getattr(object, name[, default]) ``` - **`object`**:目标对象(类/实例/模块) - **`name`**:属性名的字符串(如 `"method_name"`) - **`default`**(可选):属性不存在时返回的默认值 *(省略时若属性不存在会抛出 `AttributeError`)* #### 核心作用解析 1. **动态属性访问** 在编码时无需硬编码属性名,可通过变量传递属性名: ```python class User: roles = ["admin", "editor"] u = User() attr_name = "roles" # 动态属性名 print(getattr(u, attr_name)) # 输出: ["admin", "editor"] [^4] ``` 2. **安全访问缺失属性** 通过 `default` 参数避免 `AttributeError`: ```python age = getattr(u, "age", 18) # 属性不存在时返回默认值 print(age) # 输出: 18 [^4] ``` 3. **触发 `__getattr__` 魔术方法** 当属性未在常规位置找到时,Python 会调用对象的 `__getattr__` 方法: ```python class WrappedComplex: def __getattr__(self, name): return getattr(3.5+4.2j, name) # 委托给复数对象 obj = WrappedComplex() print(obj.real) # 输出: 3.5 [^2] ``` 4. **动态方法调用** 结合 `callable()` 检查实现方法动态执行: ```python class Processor: def transform(self, data): return data.upper() p = Processor() method = "transform" if callable(getattr(p, method)): result = getattr(p, method)("hello") # 输出: "HELLO" [^3] ``` #### 典型应用场景 1. **插件系统开发** 根据配置文件动态加载类方法: ```python plugins = {"filter": "clean_data", "analyze": "run_stats"} for action, method_name in plugins.items(): method = getattr(DataProcessor, method_name) method() ``` 2. **REST API 路由** 将 HTTP 方法映射到控制器: ```python class UserController: def get(self, id): ... def post(self, data): ... def handle_request(method, path): controller = UserController() handler = getattr(controller, method.lower()) # 动态获取 get/post handler(request.data) ``` 3. **数据序列化工具** 动态提取对象属性生成 JSON: ```python def to_dict(obj): return {attr: getattr(obj, attr) for attr in dir(obj) if not attr.startswith("__")} ``` #### 注意事项 1. **优先使用直接访问** 已知属性名时应使用 `obj.attr`,效率高于 `getattr()`[^1] 2. **`default` 陷阱** 默认值仅用于属性不存在时,不会触发 `__getattr__`: ```python class Demo: def __getattr__(self, name): return f"Fallback: {name}" d = Demo() print(getattr(d, "test")) # 触发 __getattr__ → "Fallback: test" print(getattr(d, "test", None)) # 直接返回 None [^2] ``` 3. **与 `__getattribute__` 区别** `__getattribute__` 会拦截所有属性访问,而 `__getattr__` 仅在属性缺失时触发[^3] > 总结:`getattr()` 是 Python 动态编程的核心工具之一,特别适用于需要**运行时决定属性/方法**的场景,如框架开发、元编程反射机制[^1][^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值